关于在函数中使用Array.prototype.slice.call而不是直接用slice

Posted 圣耀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于在函数中使用Array.prototype.slice.call而不是直接用slice相关的知识,希望对你有一定的参考价值。

  arguments是每个函数在运行的时候自动获得的一个近似数组的对象(除了length外没有其他属性),这个arguments对象其实并不是Array,所以没有slice方法。

  Array.prototype.slice.call( )可以间接对其实现slice的效果,而且返回的结果是真正的Array。

  slice实现数据浅拷贝,原数据不会被修改。

//查看 V8 引擎 array.js 的源码,可以将 slice 的内部实现简化为:  
   
 function slice(start, end) {   
     var len = ToUint32(this.length), result = [];   
     for(var i = start; i < end; i++) {   
         result.push(this[i]);   
     }   
     return result;   
 }       
//可以看出,slice 并不需要 this 为 array 类型,只需要有 length 属性即可。并且 length 属性可以不为 number 类型,当不能转换为数值时,ToUnit32(this.length) 返回 0. 

调用方式:

[].slice.call(arguments)
Array.prototype.slice.call(arguments) //最高效
new Array().prototype.slice.call(arguments)

转换成数组的通用函数

var toArray = function(s){ 
    try{ 
        return Array.prototype.slice.call(s); 
    } catch(e){ 
        var arr = []; 
        for(var i = 0,len = s.length; i < len; i++){ 
            //arr.push(s[i]); 
            arr[i] = s[i]; //据说这样比push快 
        } 
        return arr;
    } 
}

 

以上是关于关于在函数中使用Array.prototype.slice.call而不是直接用slice的主要内容,如果未能解决你的问题,请参考以下文章

angularjs中怎样判断一个元素是不是在一个数组中存在?

关于 Laravel - 如何在视图中使用函数字符串

关于python中argsort()函数的使用

关于Python3中函数:

关于在判断条件中使用strlen()函数的问题

关于Python中函数的使用