上一篇posts已经讨论了Array.prototype.slice.call(arguments)
的工作方式,但我不明白为什么在使用“{1}}而不是call
”对象,而apply
用于由逗号分隔的对象列表。 call
是否应该使用arguments
代替apply
的类似数组的对象?
答案 0 :(得分:3)
如果你想将参数传递给数组中的切片而不是逐个传递,那么就会有所不同。你可以这样做
[1, 2, 3, 4, 5, 6, 7] ---- our example arguments
Array.prototype.slice.call(arguments, 2, 5);
这里传递给切片方法2和5,这些是切片参数,表示您希望将索引1处的项目转换为索引处的项目。所以最有可能是3,4,5。
Array.prototype.slice.apply(arguments, [2, 5]);
这样做相同,但slice的参数可以在数组中传递。
答案 1 :(得分:1)
如果x
是一个数组,那么它们是相同的:
// find the "slice" method of an array and call it with "x" as its "this" argument
x.slice();
// find the "slice" method of an array and call it with "x" as its "this" argument
Array.prototype.slice.call(x);
func.call
的第一个参数是 this 参数,或者函数内this
的值。其余的参数是函数的参数(在这种情况下没有参数)。
使用无参数调用的slice方法只是创建一个具有相同内容的新数组。这就是我们Array.prototype.slice.call(arguments)
时想要做的事情,但是,因为arguments
不是数组,因此没有slice
方法附加到自身,我们必须使用两种方法中的第二种来获取数组的slice
方法,然后将其应用于不数组的内容:
// find the "slice" method of an array and call it with "arguments",
// which is *not* an array, as its "this" argument
Array.prototype.slice.call(arguments);