在某些场景下,需要将函数的 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)); //[]
这是为什么呢?
另外还有一个问题,是关于 Array 是怎么找到 slice 方法的。
Array 本身是没有 slice 方法,它的方法在 Array.prototype 中,而我们在调用 slice 方法的时候,如果在 Array 本身没有找到 slice 方法的话,会通过它的原型链往上查找,而 Array.proto 并没有指向 Array.prototype,而是指向 Function(),那么它是怎么找到 slice 方法的呢?
第二段代码报错是因为Array
是构造函数,不是对象,打开控制台,输入 typeof Array
,结果是 function
你也说了slice()
方法在其原型对象中,而[]
就是Array
的原型对象,在控制台中输入 Array.prototype
,结果是[]
,所以第一段代码可以顺利执行。
第二段代码如下修改就可以了
function argToArr(){
return Array.prototype.slice.call(arguments, 0); // 改这一行
}
console.log(argToArr(1,2,3));
其实你的本质问题就在于误认为Array
是数组对象,然而它是构造函数