我正在阅读有关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]
?
该示例来自上面的扩展语法超链接。
答案 0 :(得分:2)
您发现的示例有点人为,您可能不会在实际代码中看到它。这只是为了说明spread参数语法...
适用于任何可迭代表达式,包括[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的section 12.3.6.1 "Runtime Semantics: ArgumentListEvaluation"中定义。换句话说,它基本上是“当你看到{时{1}}在参数列表中,评估...X
,然后浏览它包含的值,并将每个值作为单独的参数添加“。
因此,当JavaScript在参数列表中看到X
时,它会在参数列表中添加“, 3
”。
但是,当JavaScript在参数列表中看到3
时,它会显示“创建一个包含, ...[3]
的新数组,然后遍历其每个值(仅3
)并将其添加到参数列表“。
在这两种情况下你都做同样的事情,但更简单的方法可能更快。