javascript 之call 和 apply

经常看到网上有JS数组去重的面试题 一般的都用一个对象判断
                function unique( arr ){

if(!(arr instanceof Array)){
return arr;
}
var obj = {};
var arr2 = [];
for(var i = 0 ,len = arr.length;i < len; i++){
if(obj[typeof arr[i] + arr[i]] != 1){
arr2.push(arr[i]);
obj[typeof arr[i]+arr[i]] = 1;
}
}
return arr2;
}

其实我们可以利用 indexOf 在循环中判断当前值在新数组中是否存在  当然在IE6,7,8下数组没有 indexOf 方法 ,但字符串有indexOf  
我们完全可以借用字符串的 indexOf , javascript 的 call 和 apply 就是干这个的 ,这两个函数对象的方法很强大。JS 中对象的方法,都可以使用它们来移花接木。 于是我们可以这样写
            
function unique2(arr){
                    
if(!(arr instanceof Array)){
return arr;
} 
var arr2 = [];
for(var i = 0 ,len = arr.length ;i < len ;i++){
if(String.prototype.indexOf.call( arr2 ,arr[i] ) == -1){
arr2.push(arr[i]);
}
}
return arr2;
} 

这个方法和上面的方法执行结果都一样
当然上面的数组还不能做到真正的去重 (当数组是这样的时候 
[{a:1},{b:1}]  就会有问题 我们就得使用别的方法来处理了

apply 和 call 一样 只是他们的传递的 参数不一样而已  一个是多个参数  一个是一个数组参数
    比如从一个数组中找出最大值
    console.log(Math.max.apply( Math.max.apply([1,2,4,5,4,2,1],[1,2,4,5,4,2,1])) )  
还有 将一个DOM 集合转换成数组 然后我们就可以调用数组方法了
总之在JS 中一个对象没有某个方法 而别的对象有这个方法 都可以使用call或者apply 移花接木过来使用 

javascript 之call 和 apply,布布扣,bubuko.com

javascript 之call 和 apply

上一篇:用Android++在Visual Studio中用C/C++开发Android应用


下一篇:adb shell 修改用户权限 && 删除App