在括号前面展开语法?

问题描述 投票:0回答:1

我正在从 MDN 阅读有关 数组解构 扩展语法 的信息,我偶然发现了以下示例,尽管我逐步浏览了这些材料,但它还是让我有点冷淡。

给我带来麻烦的代码是这样的:

function myFunction(v, w, x, y, z) { }
var args = [0, 1];
myFunction(-1, ...args, 2, ...[3]);

我明白了

v==-1
w==0
x==1
;和
y==2
...但是
...[3]
是什么?

示例来自上面的展开语法超链接。

javascript ecmascript-6
1个回答
4
投票

您找到的示例有点做作,您可能不会在实际代码中看到它。它只是为了说明扩展参数语法

...
适用于任何可迭代表达式,包括像
[1, 2, 3]
这样的标准数组文字。
z
将是
3
因为

myFunction(-1, ...args, 2, ...[3]);

相当于

myFunction(-1, ...args, 2, 3);

...[
]
在这种情况下基本上没有影响;这些值是从数组中取出的,所以就好像您直接将它们写入参数列表中一样。另一个例子,

myFunction(-1, ...args, 2, ...[3, 4, 5]);

相当于

myFunction(-1, ...args, 2, 3, 4, 5);

尽管

z
仍然是
3
4
5
将被忽略,因为它们是意外的额外参数)。

让我们稍微分解一下:参数列表中展开/休息语法

...
的行为在 ECMAScript 6 的第 12.3.6.1 节“运行时语义:ArgumentListEvaluation” 中定义。换句话来说,它本质上是说“当您在参数列表中看到
...X
,评估
X
,然后遍历它包含的值并将每个值添加为单独的参数”。

因此,当 JavaScript 在参数列表中看到

, 3
时,它会说“将
3
添加到参数列表中”。

但是当 JavaScript 在参数列表中看到

, ...[3]
时,它会说“创建一个包含
3
的新数组,然后遍历它的每个值(仅
3
)并将它们添加到参数列表中”。

在这两种情况下你都在做同样的事情,但更简单的方法可能更快。

© www.soinside.com 2019 - 2024. All rights reserved.