Ответ 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
для ссылки на эту конструкцию.
Похожие вопросы:
- Оператор Spread vs Rest в ES2015/es6
- Несколько раз с помощью оператора распространения в javascript?
†. Если мы очень педантичны, нам даже нужно будет различать объявление переменной (var [a, b, ...c] = d;
) и простое назначение ([a, b, ...c] = d;
), согласно спецификации.