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

why `splice.apply(arguments, 0)` fails while `splice.call(arguments, 0)` returns Array

本问题已经有最佳答案,请猛点这里访问。

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

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

你们能详细说明为什么第一个选择失败,而第二个选择成功吗?


这是因为Array.prototype.splice.apply(arguments, 0)大致相当于arguments.splice([0])strike>,正如我之前的其他人所说,apply期望数组作为其第二个参数。如果要检索n-first参数,可以执行Array.prototype.splice.apply(arguments, [0,n]),它(大致)相当于arguments.splice.(0,n)

相反,call使用任何类型的参数。Array.prototype.splice.call(arguments, 0)大致相当于arguments.splice(0),由于splice期望一个整数作为其第一个参数而不是数组,所以第二个解决方案(但不是第一个解决方案)工作。因此,埃多克斯1〔9〕也可以像杰罗·诺顿所说的那样发挥作用。

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

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

编辑:我编辑了我的答案,因为它包含了一个大错误。感谢库克怪兽的纠正。