2017-06-19 66 views
1

我在阅读关于array destructuringspread syntax来自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]

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

+1

这只是一个数组文字。想'var args2 = [3];'和'... args2'。 – Bergi

+0

谢谢我惊慌失措,过早地发布了一些问题。一个积极的事情是,我了解到,您可以以这种方式复制没有分片的数组:var arr = [1,2,3]; var arr2 = [... arr]; //像arr.slice() – alexandros84

+2

['...'不是运算符!](https:// stackoverflow。com/questions/37151966 /什么是spreadelement-in-ecmascript-documentation-it-the-same-as-spread-oper/37152508#37152508) –

回答

2

你找到的例子有点琐碎,你可能不会在真实代码中看到它。这只是为了说明扩展参数语法...适用于任何可迭代表达式,包括像[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仍然是3(因为他们意想不到的额外的参数45将被忽略)。

让我们打破这一点:在参数列表中的病毒/休息语法... ECMAScript中6 section 12.3.6.1 "Runtime Semantics: ArgumentListEvaluation"定义套用的行为,它本质上说,“当你在一个参数列表中看到...X,评估X ,然后检查它包含的值并将它们中的每一个作为单独的参数添加“。

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

但当看到的JavaScript在, ...[3]参数列表,它说:“创建一个包含3一个新的数组,然后通过它的每一个值(仅3),并将它们添加到参数列表”。

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

+0

在没有单一评论的例子中,肯定有奇怪的事情发生。很多改进的答案。我希望你明白,我不能赞同一个答案,没有upvote这个问题..我需要一些时间来接受你的答案(直到我明白了自己正在发生的事情)。 TY。 – alexandros84

+0

它就像是在其内容中传播[3],也就是3本身?所以如果是... [3,4];它会是3,4? – alexandros84

+0

@ alexandros84是的,没错,这是一个很好的例子来补充我的答案。是的,就好像'... ['和']'不存在;你放入括号内的任何值都将被视为参数,就像它们在外面一样。 –