在括号前面扩展操作员?

时间:2017-06-19 22:47:28

标签: javascript ecmascript-6

我正在阅读有关array destructuring和来自MDN的spread syntax的信息,我偶然发现以下示例让我感到有些冷漠,尽管逐步浏览了这些材料。

给我带来麻烦的代码是:

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]

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

1 个答案:

答案 0 :(得分:2)

您发现的示例有点人为,您可能不会在实际代码中看到它。这只是为了说明spread参数语法...适用于任何可迭代表达式,包括[1, 2, 3]之类的标准数组文字。 z3,因为

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仍然是345会被忽略,因为它们是意外的额外参数。)

让我们稍微分解一下:参数列表中的展开/休息语法...的行为在ECMAScript 6的section 12.3.6.1 "Runtime Semantics: ArgumentListEvaluation"中定义。换句话说,它基本上是“当你看到{时{1}}在参数列表中,评估...X,然后浏览它包含的值,并将每个值作为单独的参数添加“。

因此,当JavaScript在参数列表中看到X时,它会在参数列表中添加“, 3”。

但是,当JavaScript在参数列表中看到3时,它会显示“创建一个包含, ...[3]的新数组,然后遍历其每个值(仅3)并将其添加到参数列表“。

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