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

IT技术 javascript ecmascript-6 spread-syntax
2021-01-12 02:35:34

ECMAScript 规范中SpreadElement描述了

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

这和Spread语法一样吗

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

句法

对于函数调用:

myFunction(...iterableObj);

对于数组文字:

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

MDN文档中描述

SpreadElement和、或、传播语法的用例是什么ifSpreadElement和spread语法不同,具体体现在哪些方面?

2个回答

术语“扩展运算符”是一种“伞形术语”,指的是 ES6 中的各种语法结构,它们看起来都像...x. MDN 也是如此。

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

术语“传播运算符”可以指:

  • Spread element,var arr = [a, b, ...c]; : spread 元素将可迭代 (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):这个构造实际上在规范中没有名称但它的工作方式与扩展元素非常相似:它将可迭代对象扩展为参数列表。
    它相当于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;)。

顺便说一句,对于“...不是运算符”部分,我为此创建了一个 CW 规范(如果您还没有看过它):stackoverflow.com/q/44934828/5647260来解释更多细节,尽管是晚了一年。
2021-04-05 02:35:34

SpreadElement 只是 ES6 语法中的一个名称,用于在数组字面量中扩展“运算符”及其参数:

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

所以,SpreadElement[a, b, ...c]...c; 传播“运算符”是.... (恐吓引号,因为它不是真正意义上的运算符,例如-。)

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

不,SpreadElement是 ES6 规范中的语法规则,正如我上面所解释的,它不仅仅涵盖...运算符。而MDN将其...称为“运算符”是因为上下文中的含义很清楚,只有书呆子才会坚持syntactic construct或其他什么。
2021-03-11 02:35:34
@guest271314:您可能想查看有关令牌如何构成运算符的已删除问题的评论...
2021-03-12 02:35:34
@ guest271314-ECMA-262是语言规范,所以它是权威。MDN 是一个任何人都可以贡献的公共维基,它不是任何事情的权威。为了记录(和学究),...是一个标点符号,它构成了 SpreadElement 的一部分。
2021-04-04 02:35:34
SpreadElement只是 ES6 语法中省略运算符的一个名称”什么是“省略运算符”?
2021-04-05 02:35:34
你在调戏吗?“为什么 MDN 使用术语运算符?” 上面的回答:“MDN 将其...称为‘运算符’,因为上下文中的含义很清楚,只有学究会坚持句法结构或其他东西”。“SpreadElement 还涵盖哪些内容?” 上面回答:“ SpreadElementin[a, b, ...c]...c;传播“运算符”是...“。“什么是‘学究’?” 找一本字典。
2021-04-09 02:35:34