【问题标题】:why `splice.apply(arguments, 0)` fails while `splice.call(arguments, 0)` returns Array [duplicate]为什么`splice.apply(arguments,0)`失败而`splice.call(arguments,0)`返回数组[重复]
【发布时间】:2014-09-20 22:20:18
【问题描述】:

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

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

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

【问题讨论】:

  • .apply() 的第二个参数应该是一个数组,比如[0]
  • 其实就是callapply的主要区别。
  • 确实,所以Array.prototype.splice.apply(arguments, [0]) 应该可以工作。 apply()call() 不一样!
  • 错误信息Function.prototype.apply: argumentsArray is not an array-like object(或类似的东西)应该足够清楚,或者至少告诉你check the docs

标签: javascript


【解决方案1】:

这是因为 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
  • 是的,我做到了。缺乏等价性与 arguments 类似数组无关。
  • 就像 cookiemonster 说的,失败的不是splice
  • 哦,我的错,你是绝对正确的@cookiemonster。道歉。我将编辑我的答案。
  • 啊,我错过了你的意思。我以为你指的是前者(.call.apply)作为等价物。对于直接调用,该方法需要直接放在arguments 对象上。
猜你喜欢
  • 2016-11-02
  • 2015-10-16
  • 2016-09-07
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多