我的理解是我可以调用Array.prototype.slice.call(arguments, 1)
来返回数组的尾部。
为什么这段代码不返回[2,3,4,5]
?
function foo() {
return Array.prototype.slice.call(arguments,1);
}
alert(foo([1,2,3,4,5]));
我的理解是我可以调用Array.prototype.slice.call(arguments, 1)
来返回数组的尾部。
为什么这段代码不返回[2,3,4,5]
?
function foo() {
return Array.prototype.slice.call(arguments,1);
}
alert(foo([1,2,3,4,5]));
因为你只传递了一个参数——数组。
尝试alert(foo(1,2,3,4,5));
在 JavaScript 中,参数从 0 开始编号,所以当你从 1 开始切片并传递 1 个参数时,你什么也得不到。
请注意,它可能会妨碍优化以允许arguments
对象“泄漏”出函数。由于形式参数和形式参数之间的别名,arguments
如果对象被发送到其他地方,优化器实际上无法对函数进行任何静态分析arguments
,因为它不知道参数变量可能会发生什么。
arguments
是一个类似数组的对象,它列出了参数和一些其他属性(例如对当前函数的引用arguments.callee
)。
在这种情况下,您的arguments
对象如下所示:
arguments {
0: [1,2,3,4,5],
length: 1,
other properties here
}
我认为这很好地解释了您所看到的行为。尝试删除函数调用中的数组括号,或使用arguments[0]
来访问数组。
因为arguments
is {0: [1,2,3,4,5], length: 1}
,它是一个具有一个元素的类数组对象。具有一个元素的数组的尾部是空数组。
要么改变函数的定义:
function foo(arr) {
return Array.prototype.slice.call(arr,1);
}
或调用函数:
foo(1,2,3,4,5);