Что такое SpreadElement в документации ECMAScript? Это то же самое, что и синтаксис Spread в MDN?

В спецификации ECMAScript описывается SpreadElement

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

Это то же самое, что и синтаксис Spread

Синтаксис Spread позволяет повторить итерацию, такую как выражение массива или строку, в местах, где ожидаются нулевые или более аргументы (для вызовов функций) или элементы (для литералов массива), или выражение объекта, которое должно быть расширено в местах, где ноль или более ожидаются пары ключ-значение (для объектных литералов).

Синтаксис

Для вызовов функций:

myFunction(...iterableObj);

Для литералов массива:

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

описанных в документации MDN?

Что такое использование SpreadElement и синтаксис распространения; и если SpreadElement и синтаксис распространения различны, в чем они отличаются друг от друга?

Ответ 1

Термин "оператор распространения" является своего рода "зонтичным термином", который относится к различным синтаксическим конструкциям в ES6, которые все выглядят как ...x. MDN делает то же самое.

Однако это ошибочно, потому что ... не является оператором (по крайней мере, не в том смысле, что спецификация ECMAScript использует термин "оператор" ). Он не генерирует значение, которое может использоваться при дальнейших вычислениях. Я бы предпочел сравнить его с другими пунктуаторами, такими как , или ; (которые также являются родственными, но имеют различный смысл в другом контексте).

Термин "оператор распространения" может ссылаться на:

  • Элемент спреда var arr = [a, b, ...c];: расширенный элемент расширяет итерируемый (c) в новый массив. Это эквивалентно чему-то вроде [a,b].concat(c).

  • Элемент Rest, [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)).

    Отсутствие официального имени может быть причиной того, почему люди начали использовать "оператор распространения" . Я бы назвал это "распространенным аргументом".

  • Параметр отдыха: function foo(a, b, ...c): как и остальные элементы отдыха, параметр rest собирает оставшиеся аргументы передаются функции и делают их доступными как массив в c. Фактически спецификация ES2015 использует термин BindingRestElement для ссылки на эту конструкцию.

Похожие вопросы:


. Если мы очень педантичны, нам даже нужно будет различать объявление переменной (var [a, b, ...c] = d;) и простое назначение ([a, b, ...c] = d;), согласно спецификации.

Ответ 2

SpreadElement - это просто имя в грамматике ES6 для "оператора" распространения вместе со своим аргументом, когда в литерале Array:

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

Итак, SpreadElement в [a, b, ...c] - ...c; "Оператор распространения" - .... (пугающие цитаты, потому что он не является реальным оператором в том же смысле, что, например, - is.)

Название правила грамматики, используемого в вызовах функций, будет иным, так как это другой грамматический контекст (это всего лишь один вид ArgumentList).