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

gue*_*314 42 javascript ecmascript-6 spread-syntax

ECMAScript规范SpreadElement描述

SpreadElement[Yield]:
...AssignmentExpression[In, ?Yield]
Run Code Online (Sandbox Code Playgroud)

这与Spread语法相同

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

句法

对于函数调用:

myFunction(...iterableObj);
Run Code Online (Sandbox Code Playgroud)

对于数组文字:

[...iterableObj, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

MDN文档中描述?

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

Fel*_*ing 85

术语"传播运算符"是一种"总称术语",指的是ES6中的各种句法结构,它们都是如此...x.MDN也是如此.

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

术语"传播运营商"可以指:

  • Spread元素var arr = [a, b, ...c];:spread元素将iterable(c)扩展为新数组.它相当于类似的东西[a,b].concat(c).

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

    a = arr[0];
    b = arr[1];
    c = arr.slice(2);
    
    Run Code Online (Sandbox Code Playgroud)

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

  • fun(a, b, ...c):此构造实际上在规范中没有名称.但它与spread元素的工作方式非常相似:它将一个iterable扩展为参数列表.
    这相当于func.apply(null, [a, b].concat(c)).

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

  • Rest参数::function foo(a, b, ...c)类似于rest元素,rest参数收集传递给函数的其余参数,并使它们可用作数组c.ES2015实际规范使用该术语BindingRestElement来指代此构造.

相关问题:


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