在ECMAScript specification处描述了SpreadElement
SpreadElement[Yield]:
...AssignmentExpression[In, ?Yield]
相同
Spread语法允许在可能需要零个或多个参数(用于函数调用)或元素(用于数组文字)的位置扩展数组表达式或字符串等迭代,或者在需要扩展的位置扩展对象表达式预期零个或多个键值对(对象文字)。
语法
对于函数调用:
myFunction(...iterableObj);
对于数组文字:
[...iterableObj, 4, 5, 6]
在MDN文档中描述过?
SpreadElement
和/或扩展语法的用例是什么?如果SpreadElement
和传播语法不同,那么它们的具体方式有何不同?
答案 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
)。