Ответ 1
Синтаксис распространения (на самом деле пунктуатор, отмеченный RobG) позволяет использовать итерации для распространения на более мелкие биты. Поскольку строки являются итерабельными (они представляют собой массивы символов внутри, более конкретно упорядоченные последовательности целых чисел, представляющие символы), их можно разложить на отдельные символы.
Затем назначение деструкции выполняется в массиве для распаковки и группировки значений распространения. Поскольку вы опускаете первый элемент массива символов с помощью ,
и не назначаете ссылку, он теряется, а остальная часть итерируемого объекта сохраняется в w
, распространяется на него отдельные части, одиночные символы символа массив.
Конкретная семантика этой операции определена в Спецификация ECMAScript 2015 с помощью параметра ArrayAssignmentPattern: [Elision opt AssignmentRestElement ] производство:
12.14.5.2 Семантика времени выполнения: DestructuringAssignmentEvaluation
со значением параметра
[...]
ArrayAssignmentPattern: [Elision opt AssignmentRestElement]
- Пусть итератор GetIterator (значение).
- ReturnIfAbrupt (итератор).
- Пусть iteratorRecord будет Record {[[iterator]]: iterator, [[done]]: false}.
- Если присутствует Elision, то а. Пусть статус будет результатом выполнения IteratorDestructuringAssignmentEvaluation Elision с iteratorRecord в качестве аргумента.
б. Если статус - внезапное завершение, то я. Если iteratorRecord. [[Done]] false, верните IteratorClose (iterator, status).
II. Верните Completion (статус).- Пусть результат будет результатом выполнения IteratorDestructuringAssignmentEvaluation параметра AssignmentRestElement с iteratorRecord в качестве аргумента.
- Если iteratorRecord. [[done]] false, верните IteratorClose (итератор, результат).
- Результат возврата.
Здесь Elision относится к пропущенному элементу при распространении с одной или несколькими запятыми (,
), сравнимой с пропущенными слогами, как следует из названия, и AssignmentRestElement ссылается на цель, которая получит разброс и деструктурированные значения, w
в этом случае.
Что это значит, сначала получите итератор объекта, из внутреннего метода @@iterator
и шаги через этот итератор, пропуская, однако, многие элементы, обозначенные шириной elision, производством Elision в IteratorDestructuringAssignmentEvaluation. Как только это будет сделано, он пройдет через итератор производства AssignmentRestElement и назначит новый массив со всеми значениями распространения - то, что w
. Он получает распределенный односимвольный массив, распакованный для исключения первого символа.
Метод @@iterator
, в котором получена итерация, является известным символом и его изменение для объекта может изменить его итерации, как в Ответ Эмиссара. В частности, стандартная реализация метода @@iterator
для String выглядит следующим образом:
21.1.3.27 String.prototype [@@iterator]()
Когда вызывается метод @@iterator, он возвращает объект Iterator (25.1.1.2), который выполняет итерацию над кодовыми точками значения String, возвращая каждую кодовую точку как значение String.
Таким образом, итератор допускает итерацию через отдельные кодовые точки или символы строки - и, следовательно, распространение строки приведет к массиву ее символов.