1. 字符串去重:
1 function re(str){ 2 for (var i = 0,arr=[]; i < str.length; i++) { 3 for (var j = 0; j < arr.length; j++) { 4 if(arr[j]===str[i]){ 5 break; 6 } 7 }; 8 if (j===arr.length) { 9 arr.push(str[i]); 10 }; 11 }; 12 console.log(arr.join("")) 13 } 14 15 re("stdgdsgrn")
2. 原生call()
模拟call方法的实现:
1.第一步,(fun的this绑定给xm ) 把this绑定给xm
把fun当成xm对象的方法添加,使之成为xm内部方法(内部结构改变),使用之后删除
2.delete fun
3.第二步,call 函数可以传入参数,参数不确定
4.利用arguments对象来获取参数,从1开始到length结束
5....
1 var xm={ 2 work:"engineer", 3 }; 4 5 function fun(sname,sage){ 6 return { 7 work:this.work, 8 sname:sname, 9 sage:sage 10 } 11 }; 12 13 Function.prototype.myCall=function(obj){ 14 var obj= obj||window; 15 obj.fn=this; 16 //取出arguments的参数,放入fn() 17 for (var i = 1,arr=[]; i < arguments.length; i++) { 18 arr.push("arguments["+i+"]"); 19 }; 20 // 数组和字符串相加,拼接,数组会转化为字符串,因为那些函数的爹里面都有toString 21 var result=eval('obj.fn('+arr+')'); 22 delete obj.fn; 23 return result; //返回对象必须写在后面 24 } 25 26 console.log(fun.myCall(xm,"xx",20));
3.浅克隆
克隆小红对象(浅)------intervieeeeeeeew ----------------------------
思路:新建 遍历 赋值 返回
1 function clone(obj){ 2 var newObj=new Object(); 3 //遍历obj key是一个变量 4 for(key in obj){ 5 newObj[key]=obj[key]; 6 } 7 return newObj; 8 9 } 10 11 var clonexh=clone(xh); 12 console.log(clonexh); 13 console.log(clonexh===xh);//false 14 //因为在内存中地址不一样,只是内容相同 15 console.log(clonexh.getName===xh.getName);//true 16 //克隆时,getName是函数-引用类型,把地址赋值给了newObj 17 //一共只有一个getName函数
4.深克隆:
1 function deepClone(arr){ 2 if(typeof arr != "object"){ 3 return arr; 4 }; 5 var result = {}; 6 for(var i in arr){ 7 result[i]=deepClone(arr[i]); //递归调用 8 } 9 return result; 10 }; 11 12 13 var a = { 14 name:"Desiree", 15 age:"24", 16 hobby:"Ice-Skating" 17 }; 18 var b = deepClone(a) 19