Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';t我转换为;“论点”;对象到JavaScript中使用concat方法的数组?_Javascript_Arrays_Arguments - Fatal编程技术网

为什么可以';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's
newArray
”?看看步骤5b和5c。这就是为什么。注释似乎与算法不同,但注释显然是非正式的。这是另一个类似于
[1,2,3]
的数组。这在ES6 btw中发生了变化(至少在理论上是如此):@T.J.Crowder:这就是我添加“理论上”的原因。至少它不再局限于数组,除非数组是实现该属性的唯一对象:-/这很可能是,现在我正在考虑它,因为更改它会破坏向后兼容性?谢谢您的解释。我似乎提出了一个愚蠢的问题:P@DolphinWood例如我不会那么说。阅读规范并不像可能的那么容易(遗憾的是,这越来越糟糕,而不是更好——ES6规范使ES5规范看起来像一本儿童读物!)。