JS进阶篇--函数现实参数转换成数组的要领[].slice.call(arguments)

现实参数在函数中我们能够运用 arguments 对象取得 (注:形参可经由过程 arguments.callee 取得),虽然 arguments 对象与数组形似,但仍不是真正意义上的数组。

我们能够经由过程数组的 slice 要领将 arguments 对象转换成真正的数组。

要领一:经由过程Array.prototype属性挪用slice要领

var args = Array.prototype.slice.call(arguments);

Array 自身是没有 slice 要领,它的要领在 Array.prototype中,而我们在挪用 slice 要领的时刻,如果在 Array 自身没有找到 slice 要领的话,会经由过程它的原型链往上查找。

要领二:经由过程挪用[]的slice要领

var args = [].slice.call(arguments, 0);

要领三:经由过程遍历arguments,返回数组

function toArray(){
    var args = []; 
    for (var i = 1; i < arguments.length; i++) { 
        args.push(arguments[i]); 
    } 
    return args;
}

注:平常的函数的 arguments.length 都在 10 之内,要领二有上风;
要领二的代码量上也比第一种少,最少能够减小一点字节

实例:

function revse(){
    try{
        return Array.prototype.slice.call(arguments);
    }
    catch(e){
        var newarr=[];
        for(var i=arguments.length-1;i>=0;i--){ 
          //newarr.push(arguments[i]);
          newarr[i] = arguments[i]; //如许比push快?
        }
        return newarr;
    }
}      
var s = revse('a','b','c');
console.log(s); //["a", "b", "c"]

跟arguments问题相干问题
在某些场景下,需要将函数的 arguments 参数作为一个数组挪用,然则 arguments 是一个奇特对象,所以试着将 arguments 转化为一个数组,比方下面例子:

function argToArr(){
    return [].slice.call(arguments, 0);
}
console.log(argToArr(1,2,3));    //[1,2,3]

function argToArr(){
    return Array.slice.call(arguments, 0);
}
console.log(argToArr(1,2,3));    //Uncaught TypeError: Cannot read property 'call' of undefined

这是为何呢?
第二段代码报错是因为Array是组织函数,不是对象,翻开掌握台,输入 typeof Array,结果是 function
slice()要领在其原型对象中,而[]就是Array的原型对象,在掌握台中输入 Array.prototype,结果是[],所以第一段代码能够顺遂实行。

第二段代码以下修正就能够了:

function argToArr(){
    return Array.prototype.slice.call(arguments, 0); // 改这一行
}
console.log(argToArr(1,2,3)); 
    原文作者:风雨后见彩虹
    原文地址: https://segmentfault.com/a/1190000000410759
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞