Array.prototype.slice.call(arguments)与Array.prototype.slice.apply(arguments)的区别

6

之前的文章已经讨论了Array.prototype.slice.call(arguments)的工作原理,但我不明白为什么要使用call而不是apply,因为apply用于类似数组的对象,而call用于由逗号分隔的对象列表。难道arguments不是类似数组的对象吗?应该使用apply而不是call吧?


3
即使您使用apply而不是callarguments仍然是thisArg,而不是argsArray,因此它不会改变任何东西。 翻译:即使您使用 apply 代替 callarguments 是指向 thisArg(函数的上下文对象),而不是 argsArray(参数数组),因此这不会改变任何内容。 - user2357112
你的链接已经失效了,所以无法确定你是否正确阅读它。 - Jaromanda X
1
你是想链接到这篇帖子吗?Array.prototype.slice.call() 是如何工作的? - Jonathan Lonowski
2
每个方法传递的第一个参数都是相同的。它们之间的区别在于第二个或更多的参数。.call(thisArg, arg0, arg1, ...)apply(thisArg, argsList)。给定的thisArg值成为被调用函数(slice)使用的this值。 - Jonathan Lonowski
2
附注:Array.from() 已经在最近的版本中添加到语言中,部分替代了 slice 的使用。 - Jonathan Lonowski
1
可能是什么是call和apply的区别?的重复问题。 - Felix Kling
2个回答

4
如果您想将参数传递给数组中的切片而不是一个接一个地传递,那么有所区别。您可以这样做:
[1, 2, 3, 4, 5, 6, 7]  ---- our example arguments
Array.prototype.slice.call(arguments, 2, 5);

在这里,您将传递给切片方法2和5,这些是切片参数,用于指示您想要获取索引为1到索引为4的项。因此,最有可能的是它将是3、4、5。

Array.prototype.slice.apply(arguments, [2, 5]);

这样做的效果相同,但切片的参数可以作为一个数组传递。

那么如果我不传递任何参数,apply和call是一样的吗? - stackjlei
1
是的,它们的工作方式相同。顺便说一下,如果您不传递任何参数切片只会复制数组 - 无论您是调用还是应用它。 - uRTLy

2
如果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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接