为什么`splice.apply(arguments,0)`失败而`splice.call(arguments,0)`返回Array

时间:2014-07-29 13:53:27

标签: javascript

我试图将函数内可访问的arguments变量转换为数组。我尝试了两种方法:

Array.prototype.splice.apply(arguments, 0) //fails
Array.prototype.splice.call(arguments, 0) //return array

你能否详细说明为什么第一个选项失败而第二个选项成功?

1 个答案:

答案 0 :(得分:5)

那是因为 Array.prototype.splice.apply(arguments, 0)(大致)等同于arguments.splice([0]) ,正如我之前的其他人所说的那样,apply期望一个数组作为其第二个参数。如果您想要检索n个第一个参数,可以Array.prototype.splice.apply(arguments, [0,n]) {(1}},它(大致)等同于arguments.splice.(0,n)

相反,call适用于任何类型的参数。 Array.prototype.splice.call(arguments, 0)(大致)等同于arguments.splice(0),并且由于splice期望整数作为其第一个参数而不是数组,因此第二个解决方案有效(但不是第一个)。因此,Array.prototype.splice.apply(arguments, [0])也可以作为Jeroen Noten的建议。

请注意"等价物"我指的是实际工作,因为arguments 不是一个数组,而是一个类似数组的对象。

但是,您提到的技术经常用于将类似数组的对象转换为适当的数组。

编辑:我编辑了我的答案,因为它包含了一个大错误。感谢cookiemonster进行更正。