Array.prototype.slice.call(arguments)与Array.prototype.slice.apply(arguments)

时间:2016-09-28 00:05:55

标签: javascript prototype

上一篇posts已经讨论了Array.prototype.slice.call(arguments)的工作方式,但我不明白为什么在使用“{1}}而不是call”对象,而apply用于由逗号分隔的对象列表。 call是否应该使用arguments代替apply的类似数组的对象?

2 个答案:

答案 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);