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

6

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

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

请问你们能否详细说明第一种选项失败的原因而第二种选项成功的原因?

14
.apply() 的第二个参数应该是一个数组,例如 [0] - Pointy
2
这实际上是callapply之间的主要区别。 - Andy
确实,所以 Array.prototype.splice.apply(arguments, [0]) 应该可以工作。apply()call() 是不同的! - Jeroen Noten
错误信息 Function.prototype.apply: argumentsArray 不是类似数组的对象(或类似此类)应该足够清晰,或者至少告诉您要查看文档 - Bergi
由于http://www.ecma-international.org/ecma-262/5.1/#sec-15.3.4.3。 - dfsq
@Pointy,谢谢,你能把你的评论变成答案,这样我就可以标记它为答案了吗? - Max Koretskyi
1个回答

7
那是因为 Array.prototype.splice.apply(arguments, 0) 大致相当于 arguments.splice([0]),正如其他人之前所说的,apply 期望其第二个参数为数组。如果您想要检索前 n 个参数,则可以执行 Array.prototype.splice.apply(arguments, [0,n]),这大致相当于 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 进行纠正。

你读了我写的内容吗?oO - Waldo Jeffers
1
就像cookiemonster所说的那样,失败的不是splice - Bergi
1
哦,我的错,@cookiemonster,你是完全正确的。抱歉。 我会编辑我的回答。 - Waldo Jeffers
1
啊,我误解了你的意思。我以为你是指前者(.call.apply)作为等价物。对于直接调用,该方法需要直接放置在“arguments”对象上。 - cookie monster
@WaldoJeffers:没错,+1。 - cookie monster
显示剩余3条评论

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