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 方法的话,会经过它的原型链往上查找。prototype

方法二:经过调用[]的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 之内,方法二有优点;
方法二的代码量上也比第一种少,至少能够减少一点字节code

实例:对象

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,结果是[],因此第一段代码能够顺利执行。原型

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

function argToArr(){
    return Array.prototype.slice.call(arguments, 0); // 改这一行
}
console.log(argToArr(1,2,3));
相关文章
相关标签/搜索