1. 疾速排序算法
- 要领一
function quicksort(n,left,right){
var p;
if(left<right){
p = position(n,left,right);
quicksort(n,left,p-1);
quicksort(n,p+1,right);
}
}
function position(n,left,right){
var temp = n[left];
while(left<right){
while(left<right&&n[right]>temp)
right--;
if(left<right)
n[left++]=n[right];
while(left<right&&n[left]<temp)
left++;
if(left<right)
n[right--]=n[left];
}
n[left]=temp;
return left;
}
var a =[50, 32, 11, 16, 32, 24, 99, 57, 100];
quicksort(a,0,a.length-1)
console.log(a);
- 要领二
function quickSort(arr,left,right){
var p;
if(left<right){
p=position(arr,left,right);
quicksort(arr,left,p-1);
quicksort(arr,p+1,right);
}
function position(arr,left,right){
var temp=arr[left];
while(left<right){
while(left<right&&arr[right]>temp) right--;
if(left<right) arr[left++]=arr[right];
while(left<right&&arr[left]<temp) left++;
if(left<right) arr[right--]=arr[left];
}
arr[left] =temp;
return left;
}
}
2. 深度克隆clone(继续)
var cloneObj = function(obj){
var str, newobj = obj.constructor === Array ? [] : {};
if(typeof obj !== 'object'){
return;
} else if(window.JSON){
str = JSON.stringify(obj), //系列化对象
newobj = JSON.parse(str); //复原
} else {
for(var i in obj){
newobj[i] = typeof obj[i] === 'object' ? cloneObj(obj[i]) : obj[i];
}
}
return newobj;
};
//测试
var obj = {a: 0, b: 1, c: 2};
var arr = [0, 1, 2];
//实行深度克隆
var newobj = cloneObj(obj);
var newarr = cloneObj(arr);
//对克隆后的新对象举行成员删除
delete newobj.a;
newarr.splice(0,1);
console.log(obj);
console.log(arr);
console.log(newobj);
console.log(newarr);
/*
效果:
{a: 0, b: 1, c: 2}
[0, 1, 2]
{b: 1, c: 2}
[1, 2]
*/
3. 找出字符串或许数组中涌现雷同字符, 而且打印出次数最多的次数和字符
var str = "abcdefgaddda";
var obj = {};
for (var i = 0, l = str.length; i < l; i++) {
var key = str[i];
if (!obj[key]) {
obj[key] = 1;
} else {
obj[key]++;
}
}
var max = -1;
var max_key = "";
var key;
for (key in obj) {
if (max < obj[key]) {
max = obj[key];
max_key = key;
}
}
alert("max:" + max + " max_key:" + max_key);
4. 剖析url为json数据格式 也叫将url的查询参数剖析成字典对象同范例
function getUrl(url){
//var arr=url.split('?')[1].split('&');
var arr = [];
var a3= [];
arr = url.split("?");
a1 = arr[1];
a2 = a1.split("&");
obj = {};
for(var i=0;i<a2.length;i++){
a3[i] = a2[i].split("=");
obj[a3[i][0]] = a3[i][1];
}
return obj;
}
var url= "URL:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e";
//console.log(getUrl(url));
var getjson = function(url) {
var a = [];
var obj = {};
var a = url.split('?')[1].split('&');
for (var i = 0; i < a.length; i++) {
var b[i] = a[i].split('=');
obj[b[i][0]] = b[i][1];
}
return obj;
}
getjson(url);
//正则要领
function getQueryObject(url) {
url = url == null ? window.location.href : url;
var search = url.substring(url.lastIndexOf("?") + 1);
var obj = {};
var reg = /([^?&=]+)=([^?&=]*)/g;
search.replace(reg, function (rs, $1, $2) {
var name = decodeURIComponent($1);
var val = decodeURIComponent($2);
val = String(val);
obj[name] = val;
return rs;
});
return obj;
}
5. 通用事宜注册函数
var obj = document.getElementById("p");
var type = click;
function fun() {}
function addEvent(obj, type, fun) {
if (obj.addEventListener) {
obj.addEventListener(type, fun, false);
} else if (obj.attachEvent) {
obj.attachEvent("on" + type, fun);
} else {
obj["on" + type] = fun;
}
}
6. 写一个猎取url中参数的值的函数
function getRequest() {
var url = window.location.search;
var oRequest = new Object();
if (url.indexOf('?') !== -1) {
url = url.substr(1); // 获得?今后的字符串
var reqArr = url.split('&');
for (var i = 0; i < reqArr.length; i++) {
oRequest[(reqArr[i].split('='))[0]] = unescape((reqArr[i].split('='))[1]);
}
}
return oRequest;
}
7. JS中的数据范例? 怎样推断一个变量是不是是String范例
var str = new String("abcd");
console.log(typeof str); // object
console.log(str instanceof String); //true
console.log(str.constructor == String); //true
console.log(Object.prototype.toString.call(str) === "[object String]"); // true
var str1 = "abcd";
console.log(typeof str1); // string
console.log(str1 instanceof String); //fasle
console.log(str1.constructor == String); //true
console.log(Object.prototype.toString.call(str1) === "[object String]"); // true*/
8. 请完成, 鼠标点击页面中的恣意标签, alert该标签的称号.( 注重兼容性)
document.onclick = function(e) {
var e = e || window.event;
var obj = e.target || e.srcElement;
alert(obj.tagName.toLowerCase());
}
9. js异步加载的三种处理方案
(1) defer,只支撑IE
<script type="text/javascript" defer="defer">
alert(document.getElementById("p1").firstChild.nodeValue);
</script>
(2) async:
<script type="text/javascript" src="demo_async.js" async="async"></script>
(3) 建立script,插进去到DOM中,加载终了后callBack,见代码:
function loadScript(url, callback){
var script = document.createElement("script");
script.type = "text/javascript";
if(script.readyState){//IE
script.onreadystatechange = function(){
if(script.readyState == "loaded" ||
script.readyState == "complete"){
script.onreadystatechange = null;
callback();
}
};
}else{//firefox,safari,chrome,opera
script.onload = function(){
callback();
};
}
script.src = url;
document.body.appendChild(script);
}
10. 二分搜刮,从数组中找到findvalue
function binarySearch(arr,start,end,findvalue){
var arr = arr.sort(function(a,b){return a-b});
var mid=Math.floor((start+end)/2);
var midvalue = arr[mid];
if(midvalue==findvalue){
return mid;
}else if(findvalue<midvalue){
binarySearch(arr,start,mid-1,findvalue);
}else if(findvalue>midvalue){
binarySearch(arr,mid+1,end,findvalue);
}else{
return -1;
}
}
11. javascript保留两位小数
num.toFixed(2);
function toDecimal(x) {
var f = parseFloat(x)
if(isNaN(f)){
return false;
}
var f = Math.round(x*100)/100;
var s = f.toString();
var rs = s.indexOf('.');
if(rs<0){
rs=s.length;
s+='.';
}
while(s.length<=rs+2){
s+='0';
}
return s;
}
12. 编写一个要领 求一个字符串的字节长度;英文占一个, 中文占两个
要领一:
function getStrlen(str) {
var len = str.length;
var re = /[\u4e00-\u9fa5]/;
for(var i=0;i<str.length;i++){
if(re.test(str.charAt(i)))
len++;
}
return len;
}
要领二:
function getStrlen(str){
var len= str.length;
for(var i=0;i<str.length;i++){
if(str.charCodeAt(i)>255)
len++;
}
return len;
}
13. 编写一个要领 去掉一个数组的反复元素
要领一:该要领数组内递次稳定
function delRepeat(arr){
var a = [];
for(var i=0,l=arr.length;i<l;i++){
if(arr.indexOf(arr[i])==i){
a.push(arr[i])
}
}
return a;
}
要领二:该要领由于排序缘由,致使去重后数组内元素排序差别
function unique(arr){
arr.sort();
var re=[arr[0]];
for(var i=1,len=arr.length;i<len;i++){
if(arr[i]!==arr[i-1]){
re.push(arr[i]);
}
}
return re;
}
要领三:数组过滤
function unique(arr){
return arr.filter((item, index, array) => array.indexOf(item) === index);
}
要领四:ES6
Array.form(...new Set(arr)) [...new Set(arr)]
13 输入两个数字,输出这两个数字的最大公约数。如16,4输出4。
最大公约数就是<=最小的那个数,那就从最小的那个数最先一个一个试
function maxDivisor(num1,num2){
var max=num1>num2?num1:num2,
min=num1>num2?num2:num1;
for(var i=min;i>=1;i--){
if(max%i==0&&min%i==0){
return i;
}
}
}
顺带也写下最小公倍数就是>=最大的那个数,那就从最大的那个数最先一个一个试
function minDivisor(num1,num2){
var max=num1>num2?num1:num2,
min=num1>num2?num2:num1;
for(var i=max;i>=max;i++){
if(i%max==0&&i%min==0){
return i;
}
}
}
要领挺多,另有展转相除法,用递归做。
function maxDivisor(num1,num2){
if(num2==0){
return num1;
}else{
return maxDivisor(num2,num1%num2);
}
}
14. JavaScript中怎样检测一个变量是一个String范例? 请写出函数完成
//推断是不是是String
function isString(str){
return ((str instanceof String) || (typeof str).toLowerCase() == 'string');
}
//测试案例
var s1 = "abc",
var s2 = new String("abc");
console.log(isString(s1)+'\n');
console.log(isString(s2));
//JS内里String的初始化有两种体式格局:直接赋值和String对象的实例化
var str = "abc";
var str = new String("abc");
//平常来讲推断一个对象的范例运用typeof,但是在new String的情况下的效果会是object
//此时须要经由过程instanceof来推断
obj.constructor == String;
obj instanceof String;
15. 鼠标点击页面中的恣意标签, alert该标签的称号.( 注重兼容性)
要领一: DOM0级事宜
document.onclick = function(e){
var e = e||window.event;
var target = e.target || e.srcElement;
console.log(target.tagName.toLowerCase());
}
要领二: DOM2级事宜
事宜代办
function callback(e) {
var e = e || window.event;
var target = e.target || e.srcElement;
console.log(target.tagName);
}
if (document.addEventListener) {
document.addEventListener('click', callback, false)
} else if (document.attachEvent) {
document.attachEvent('onclick', callback)
} else {
document['onclick'] = callback;
}
手写Function.bind函数
bind()要领会建立一个新函数,当这个新函数被挪用时,它的this值是传递给bind()的第一个参数, 它的参数是bind()的其他参数和其底本的参数.
bind() 最简朴的用法是建立一个函数,使这个函数不论怎么挪用都有一样的 this 值。JavaScript新手经常犯的一个毛病是将一个要领从对象中拿出来,然后再挪用,愿望要领中的 this 是本来的对象。(比如在回调中传入这个要领。)假如不做特别处置惩罚的话,平常会丧失本来的对象。从本来的函数和本来的对象建立一个绑定函数,则能很漂亮地处理这个题目:
this.x = 9;
var module = {
x: 81,
getX: function() { return this.x; }
};
module.getX(); // 81
var retrieveX = module.getX;
retrieveX(); // 9, because in this case, "this" refers to the global object
// Create a new function with 'this' bound to module
//New programmers (like myself) might confuse the global var getX with module's property getX
var boundGetX = retrieveX.bind(module);
boundGetX(); // 81
Polyfill(兼容旧浏览器)
if (!Function.prototype.bind) {
Function.prototype.bind = function () {
var self = this, // 保留原函数
context = [].shift.call(arguments), // 保留须要绑定的this上下文
args = [].slice.call(arguments); // 盈余的参数转为数组
return function () { // 返回一个新函数
self.apply(context,[].concat.call(args, [].slice.call(arguments)));
}
}
}
写一个推断质数的isPrime()函数,当其为质数时返回true,不然返回false。
function isPrime(number) {
if (typeof number !== 'number' || !Number.isInteger(number)) {
// Alternatively you can throw an error.
return false;
}
if (number < 2) {
return false;
}
if (number === 2) {
return true;
} else if (number % 2 === 0) {
return false;
}
var squareRoot = Math.sqrt(number);
for(var i = 3; i <= squareRoot; i += 2) {
if (number % i === 0) {
return false;
}
}
return true;
}
16通用事宜处置惩罚函数
// event(事宜)东西集,泉源:github.com/markyun
EventUtil = {
// 页面加载完成后
readyEvent : function(fn) {
if (fn==null) {
fn=document;
}
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = fn;
} else {
window.onload = function() {
oldonload();
fn();
};
}
},
// 视才能离别运用dom0||dom2||IE体式格局 来绑定事宜
// 参数: 操纵的元素,事宜称号 ,事宜处置惩罚顺序
addEvent : function(element, type, handler) {
if (element.addEventListener) {
//事宜范例、须要实行的函数、是不是捕捉
element.addEventListener(type, handler, false);
} else if (element.attachEvent) {
element.attachEvent('on' + type, function() {
handler.call(element);
});
} else {
element['on' + type] = handler;
}
},
// 移除事宜
removeEvent : function(element, type, handler) {
if (element.removeEnentListener) {
element.removeEnentListener(type, handler, false);
} else if (element.datachEvent) {
element.detachEvent('on' + type, handler);
} else {
element['on' + type] = null;
}
},
// 阻挠事宜 (主如果事宜冒泡,由于IE不支撑事宜捕捉)
stopPropagation : function(ev) {
if (ev.stopPropagation) {
ev.stopPropagation();
} else {
ev.cancelBubble = true;
}
},
// 作废事宜的默许行动
preventDefault : function(event) {
if (event.preventDefault) {
event.preventDefault();
} else {
event.returnValue = false;
}
},
// 猎取事宜目的
getTarget : function(event) {
return event.target || event.srcElement;
},
// 猎取event对象的援用,取到事宜的一切信息,确保随时能运用event;
getEvent : function(e) {
var ev = e || window.event;
if (!ev) {
var c = this.getEvent.caller;
while (c) {
ev = c.arguments[0];
if (ev && Event == ev.constructor) {
break;
}
c = c.caller;
}
}
return ev;
}
};
//猎取浏览器页面当前坐标
EventUtil.addEvent(btn,'click',function(e){
e = EventUtil.getEvent(e);
var pageX = e.pageX,
pageY = e.pageY;
if(!pageX) {
pageX = e.clientX + (document.body.scrollLeft || document.documentElement.scrollLeft);
}
if(!pageY) {
pageY = e.clientY + (document.body.scrollTop || document.documentElement.scrollTop);
}
console.log("页面X轴坐标为:"+pageX + " "+ "页面Y轴坐标为:"+pageY);
});
17javascript 事宜派发 dispathEvent
单个派发事宜
//document上绑定自定义事宜onDataRes
document.addEventListener('onDataRes', function (event) {
alert(event.eventType);
}, false
);
var obj = document.getElementById("obj");
//obj元素上绑定click事宜
obj.addEventListener('click', function (event) {
alert(event.eventType);
}, false
);
//挪用document对象的 createEvent 要领获得一个event的对象实例。
var event = document.createEvent('HTMLEvents');
// initEvent接收3个参数:
// 事宜范例,是不是冒泡,是不是阻挠浏览器的默许行动
event.initEvent("onDataRes", true, true);
event.eventType = 'message';
//触发document上绑定的自定义事宜onDataRes
document.dispatchEvent(event);*/
/*var event1 = document.createEvent('HTMLEvents');
event1.initEvent("click", true, true);
event1.eventType = 'message';
//触发obj元素上绑定click事宜
document.getElementById("test").onclick = function () {
obj.dispatchEvent(event1);
};
支撑ie浏览器通用派发事宜触发
var dispatch = function(ele, evt) {
if(document.addEventListener){
var event = document.createEvent('HTMLEvents');
event.initEvent(evt, true, true);
document.dispatchEvent(event);
}else {
var event = document.createEventObject();
document.fireEvent('on'+evt, event)
}
}
var li = document.getElementById('li');
document.addEventListener('onDataRes', function (event) {
alert(event.eventType);
}, false
);
dispatch(li, 'onDataRes')
18,事宜代办对照
1.要领一:轮回绑定
<ul id="list"></ul>
<script>
function bindEvent(el, n) {
addEvent(lis[i], 'click', function() { console.log(i); });
}
// 用 setTimeout 模仿 Ajax 伪代码
setTimeout(function() {
var ajaxData = '<li id="item-1">item1</li> <li id="item-2">item2</li>
<li id="item-3">item3</li> ;
var ul = document.getElementById('list')
ul.innerHTML(ajaxData);
var lis = ul.getElementsByTagName('li');
for (var i = 0; i < lis.length; i++) {
bindEvent(lis[i], i);
}
}, 1000);
</script>
2.要领2 ,事宜代办,绑定到ul元素上
<ul id="list"></ul>
<script>
function delegateEvent(el, eventType, fn) {
addEvent(el, eventType, function(event) {
event = event || window.event;
var target = event.target || event.srcElement;
fn(target);
});
}
var el = document.getElementById('list');
// 用 setTimeout 模仿 Ajax 伪代码
setTimeout(function() {
var ajaxData = '<li id="item-1">item1</li> <li id="item-2">item2</li>
<li id="item-3">item3</li> <li id="item-4">item4</li>
<li id="item-5">item5</li>';
el.innerHTML(ajaxData)
}, 1000);
delegateEvent(el, 'click', function(target) {
console.log(target.id);
});
</script>
19,对象深拷贝
1.递归处理
let obj = {name:'fiona-SUN'};
let copyFunc = (originObj) => {
let copyObj = {};
for(let key in originObj){
copyObj[key] = originObj[key];
}
return copyObj;
};
let copyObj = copyFunc(obj);
copyObj.name = 'fiona';
console.log(copyObj.name); // 'fiona'
console.log(obj.name); // 'fiona-SUN'
要领二:经由过程JSON去剖析
let obj = {name:'fiona-SUN'};
let copyObj = JSON.parse(JSON.stringify(obj));
copyObj.name = 'fiona';
console.log(copyObj.name); // 'fiona'
console.log(obj.name); // 'fiona-SUN'
要领三:es6之睁开Object.assign(拷贝obj的内容到一个新的堆内存,copyObj存储新内存的援用)
let obj = {name:'fiona-SUN'};
let copyObj = Object.assign({}, obj);
copyObj.name = 'fiona';
console.log(copyObj.name); // 'fiona'
console.log(obj.name); // 'fiona-SUN'
要领四:es6之睁开运算符(仅用于数组)
let arr = [1,2,3];
let copyArr = [...obj];
copyArr[2] = 0;
console.log(copyArr[2]); // 0
console.log(arr[2]); // 2
20, JS猎取对象最大层级数
var res = 1;
function loopGetLevel(obj, level) {
var level = level ? level : 1;
if (typeof obj === 'object') {
for (var key in obj) {
if (typeof obj[key] === 'object') {
loopGetLevel(obj[key], level + 1);
} else {
res = level + 1 > res ? level + 1 : res;
}
}
} else {
res = level > res ? level : res;
}
}