JavaScript. Подробное руководство, 6-е издание, стр. 150

<b>  type: &quot;расширение&quot;,</b>

<b>  impl: [{engine: &quot;spidermonkey&quot;, version: 1.7},</b>

<b>         {engine: &quot;rhino&quot;, version: 1.7}]</b>

<b>};</b>

<b>// Использовать присваивание с разложением для извлечения </b>

<b>// четырех значений из структуры данных</b>

<b>let ({name:feature, </b>
<b>impl: [{engine:impl1, version:v1},{engine:impl2}]} = data) {</b>

<b>    console.log(feature); // Выведет &quot;присваивание с разложением&quot;</b>

<b>    console.log(impl1); // Выведет &quot;spidermonkey&quot;</b>

<b>    console.log(v1); // Выведет 1.7</b>

<b>    console.log(impl2); // Выведет &quot;rhino&quot;</b>

<b>}</b>

Имейте в виду, что подобные вложенные инструкции присваивания с разложением могут превратить программный код в трудночитаемые дебри, вместо того чтобы упростить его. Однако есть одна интересная закономерность, которая поможет вам разобраться в самых сложных случаях. Представьте сначала обычное присваивание (с единственным значением). После того как присваивание будет выполнено, переменную слева от оператора присваивания можно взять и использовать как выражение, которое будет возвращать присвоенное значение. Мы говорили, что в инструкции присваивания с разложением слева указывается синтаксическая конструкция, напоминающая литерал массива или объекта. Но обратите внимание, что после выполнения присваивания с разложением программный код слева, который выглядит как литерал массива или объекта, действительно будет интерпретироваться как обычный литерал массива или объекта: все необходимые переменные будут определены, и вы сможете копировать текст слева от знака «равно» и использовать его в своей программе как массив или объект.

11.4. Итерации

Проектом Mozilla в расширение JavaScript были добавлены новые способы выполнения итераций, включая цикл

<b>for each</b>
, а также итераторы и генераторы в стиле языка Python. Они детально описываются ниже.

11.4.1. Цикл for/each

Цикл

<b>for/each</b>
- это новая инструкция цикла, определяемая стандартом Е4Х. Е4Х (ECMAScript for XML) - это расширение языка, позволяющее употреблять в программах на языке JavaScript теги языка XML и предоставляющее функции для работы с данными в формате XML. Стандарт Е4Х реализован далеко не во всех веб-броузерах, но он поддерживается реализацией JavaScript проекта Mozilla, начиная с версии 1.6 (в Firefox 1.5). В этом разделе мы рассмотрим только цикл
<b>for/ each</b>
и особенности его использования с обычными объектами, не имеющими отношения к XML. Остальные подробности о Е4Х приводятся в разделе 11.7.

Цикл

<b>for each</b>
напоминает цикл
<b>for/in</b>
. Однако вместо итераций по свойствам объекта он выполняет итерации по значениям свойств:

<b>let о = {one: 1, two: 2, three: 3}</b>

<b>for(let p in o) console.log(p);       // for/in: выведет 'one', 'two', 'three'</b>

<b>for each (let v in o) console.log(v); // for/each: выведет 1, 2, 3</b>

При использовании с массивами цикл

<b>for/each</b>
выполняет итерации по элементам (а не по индексам) массива. Обычно он перечисляет их в порядке следования числовых индексов, но в действительности такой порядок не определяется стандартом и не является обязательным:

<b>а = ['один', два', 'три'];</b>

<b>for(let р in a) console.log(p); // Выведет индексы массива 0, 1, 2</b>

<b>for each (let v in a) console.log(v); // Выведет элементы 'один', 'два', три'</b>

Обратите внимание, что область применения цикла

<b>for/each</b>
не ограничивается элементами массива - он может перечислять значения перечислимых свойств объекта, включая перечислимые методы, унаследованные объектом. По этой причине обычно не рекомендуется использовать цикл
<b>for/each</b>
для работы с объектами. Это особенно верно для программ, которые должны выполняться под управлением версий интерпретаторов JavaScript до ECMAScript 5, в которых невозможно сделать пользовательские свойства и методы неперечислимыми. (Смотрите аналогичное обсуждение цикла
<b>for/in</b>
в разделе 7.6.)

11.4.2. Итераторы

В версии JavaScript 1.7 цикл

<b>for/in</b>
был дополнен более универсальными возможностями. Цикл
<b>for/in</b>
в JavaScript 1.7 стал больше похож на цикл
<b>for/in</b>
в языке Python, он позволяет выполнять итерации по любым итерируемым объектам. Прежде чем обсуждать новые возможности, необходимо дать некоторые определения.

Итератором называется объект, который позволяет выполнять итерации по некоторой коллекции значений и хранит информацию о текущей «позиции» в коллекции. Итератор должен иметь метод

<b>next().</b>
Каждый вызов метода
<b>next()</b>
должен возвращать следующее значение из коллекции. Например, функция
<b>counter(),</b>
представленная ниже, возвращает итератор, который, в свою очередь, возвращает последовательность увеличивающихся целых чисел при каждом вызове метода
<b>next().</b>
Обратите внимание, что здесь для хранения текущей информации используется область видимости функции, образующая замыкание:

<b>// Функция, возвращающая итератор;</b>

<b>function counter(start) {</b>

<b>  let nextValue = Math.round(start); // Частная переменная итератора</b>

<b>  return { next: function() {</b>

<b>                          return nextValue++; }</b>

<b>  }; // Вернуть итератор</b>

<b>}</b>