为什么可以';t我转换为;“论点”;对象到JavaScript中使用concat方法的数组?
我试图用另一个数组连接一个为什么可以';t我转换为;“论点”;对象到JavaScript中使用concat方法的数组?,javascript,arrays,arguments,Javascript,Arrays,Arguments,我试图用另一个数组连接一个参数对象,我编写了如下代码: [].concat.call(arguments, newArray) 但是它返回[[对象参数],…],这正是我想要的。我在谷歌上搜索并找到了一些解释,解释了为什么我可以通过切片方法来实现这一点: 但在查阅规范后,我发现concat方法的定义是相同的: 注意concat函数是有意通用的;它不要求其此值是数组对象。因此,它可以被转移到其他类型的对象中用作方法。concat功能能否成功应用于主机对象取决于实现 规范如下: 现在我弄不明白为什么
参数
对象,我编写了如下代码:
[].concat.call(arguments, newArray)
但是它返回[[对象参数],…]
,这正是我想要的。我在谷歌上搜索并找到了一些解释,解释了为什么我可以通过切片方法来实现这一点:
但在查阅规范后,我发现concat方法的定义是相同的:
注意concat函数是有意通用的;它不要求其此值是数组对象。因此,它可以被转移到其他类型的对象中用作方法。concat
功能能否成功应用于主机对象取决于实现
规范如下:
现在我弄不明白为什么我不能通过
concat
方法将参数
对象转换为数组。可以在中找到详细信息。基本上,它首先创建一个要处理的事物列表,其中列表上的第一项是调用它的对象(this
),然后列表上的后续项是函数的参数。然后它在列表中循环并处理每个项目。对于列表中不是数组的项,它有一个显式分支,该分支的“else”是(步骤5(c)):
- 否则,E不是数组
- 使用参数ToString(n)、属性描述符{[[Value]]:E、[[Writable]]:true、[[Enumerable]]:true、[[Configurable]]:true}和false调用的[[DefineOwnProperty]]内部方法
- 增加氮1
concat
。它没有失败。但它并不像对待数组那样对待非数组
请注意,ES6中的这种“仅数组将其条目分散”正在发生变化。在对象上使用新的循环来确定是否应该循环遍历它们的条目。我不认为
arguments
对象会有那个标志,尽管(至少,我在中没有看到任何这样说的),可能是为了避免向后兼容性的问题。”我写了这样的代码“What'snewArray
”?看看步骤5b和5c。这就是为什么。注释似乎与算法不同,但注释显然是非正式的。这是另一个类似于[1,2,3]
的数组。这在ES6 btw中发生了变化(至少在理论上是如此):@T.J.Crowder:这就是我添加“理论上”的原因。至少它不再局限于数组,除非数组是实现该属性的唯一对象:-/这很可能是,现在我正在考虑它,因为更改它会破坏向后兼容性?谢谢您的解释。我似乎提出了一个愚蠢的问题:P@DolphinWood例如我不会那么说。阅读规范并不像可能的那么容易(遗憾的是,这越来越糟糕,而不是更好——ES6规范使ES5规范看起来像一本儿童读物!)。