ECMAScript文档中的SpreadElement是什么?它与MDN上的Spread语法相同吗?

时间:2016-05-11 02:13:11

标签: javascript ecmascript-6 spread-syntax

ECMAScript specification处描述了SpreadElement

SpreadElement[Yield]:
...AssignmentExpression[In, ?Yield]

这与Spread syntax

相同
  

Spread语法允许在可能需要零个或多个参数(用于函数调用)或元素(用于数组文字)的位置扩展数组表达式或字符串等迭代,或者在需要扩展的位置扩展对象表达式预期零个或多个键值对(对象文字)。

     

语法

     

对于函数调用:

myFunction(...iterableObj);
     

对于数组文字:

[...iterableObj, 4, 5, 6]

MDN文档中描述过?

SpreadElement和/或扩展语法的用例是什么?如果SpreadElement和传播语法不同,那么它们的具体方式有何不同?

2 个答案:

答案 0 :(得分:81)

术语“传播运算符”是一种“总称术语”,指的是ES6中的各种句法结构,它们都看起来像...x。 MDN也是如此。

然而,这是误导,因为...不是运算符(至少在某种意义上ECMAScript规范使用术语“运算符”)。它不会生成可用于进一步计算的值。我宁愿将它与其他标点符号进行比较,例如,;(它们也是相关的,但在不同的上下文中有不同的含义)。

术语“传播运营商”可以指:

  • Spread element, var arr = [a, b, ...c];:spread元素将iterable(c)扩展为新数组。它等同于[a,b].concat(c)

  • Rest element, [a, b, ...c] = arr; :在内部解构中,...结构具有相反的效果:收集将剩余元素放入数组中。这里的例子相当于

    a = arr[0];
    b = arr[1];
    c = arr.slice(2);
    

    (请注意,这只是近似值,因为解构适用于任何可迭代值,而不仅仅是数组)

  • fun(a, b, ...c) :此构造doesn't actually have a name in the spec。但它与扩展元素的作用非常相似:它将迭代扩展为参数列表 它等同于func.apply(null, [a, b].concat(c))

    缺乏官方名称可能是人们开始使用“传播运营商”的原因。我可能会称之为“传播论证”。

  • Rest parameter: function foo(a, b, ...c):与rest元素类似,rest参数收集传递给函数的其余参数,并使它们在c中作为数组使用。 ES2015实际规范使用术语BindingRestElement来引用此构造。

相关问题:

:如果我们非常迂腐,我们甚至必须区分变量声明(var [a, b, ...c] = d;)和简单赋值([a, b, ...c] = d; ),根据规范。

答案 1 :(得分:0)

SpreadElement只是ES6语法中的一个名称,用于扩展“operator”及其在Array文字中的参数:

SpreadElement[Yield]:
    ... AssignmentExpression[In, ?Yield]

因此,SpreadElement中的[a, b, ...c]...c;传播“运营商”是...。 (恐吓引用,因为它不是真正的运算符,例如-就是这样。)

函数调用中使用的语法规则的名称会有所不同,因为它是一个不同的语法上下文(它只是一种ArgumentList)。