JavaScript. Подробное руководство, 6-е издание
Шрифт:
Цикл
for each
напоминает цикл for/in
. Однако вместо итераций по свойствам объекта он выполняет итерации по значениям свойств:
let о = {one: 1, two: 2, three: 3}
for(let p in o) console.log(p); // for/in: выведет 'one', 'two', 'three'
for each (let v in o) console.log(v); // for/each: выведет 1, 2, 3
При использовании с массивами цикл
for/each
выполняет итерации по элементам (а не по индексам) массива. Обычно он перечисляет их в порядке следования числовых индексов, но в действительности такой порядок не определяется стандартом и не является обязательным:
а = ['один', два', 'три'];
for(let р in a) console.log(p); // Выведет индексы массива 0, 1, 2
for each (let v in a) console.log(v); // Выведет элементы 'один', 'два', три'
Обратите внимание, что область применения цикла
for/each
не ограничивается элементами массива - он может перечислять значения перечислимых свойств объекта, включая перечислимые методы, унаследованные объектом. По этой причине обычно не рекомендуется использовать цикл for/each
для работы с объектами. Это особенно верно для программ, которые должны выполняться под управлением версий интерпретаторов JavaScript до ECMAScript 5, в которых невозможно сделать пользовательские свойства и методы неперечислимыми. (Смотрите аналогичное обсуждение цикла for/in
в разделе 7.6.) 11.4.2. Итераторы
В версии JavaScript 1.7 цикл
for/in
был дополнен более универсальными возможностями. Цикл for/in
в JavaScript 1.7 стал больше похож на цикл for/in
в языке Python, он позволяет выполнять итерации по любым итерируемым объектам. Прежде чем обсуждать новые возможности, необходимо дать некоторые определения. Итератором называется объект, который позволяет выполнять итерации по некоторой коллекции значений и хранит информацию о текущей «позиции» в коллекции. Итератор должен иметь метод
next.
Каждый вызов метода next
должен возвращать следующее значение из коллекции. Например, функция counter,
представленная ниже, возвращает итератор, который, в свою очередь, возвращает последовательность увеличивающихся целых чисел при каждом вызове метода next.
Обратите внимание, что здесь для хранения текущей информации используется область видимости функции, образующая замыкание:
// Функция, возвращающая итератор;
function counter(start) {
let nextValue = Math.round(start); // Частная переменная итератора
return { next: function {
return nextValue++; }
}; // Вернуть итератор
}
let serialNumberGenerator = counter(1000);
let sn1 = serialNumberGenerator.next; // 1000
let sn2 = serialNumberGenerator.next; // 1001
При работе с конечными коллекциями метод
next
итератора возбуждают исключение Stoplteration
, когда в коллекции не остается значений для выполнения очередной итерации. Stoplteration
– это свойство глобального объекта в JavaScript 1.7. Его значением является обычный объект (без собственных свойств), зарезервированный специально для нужд завершения итераций. Обратите внимание, что Stoplteration
не является функцией-конструктором, таким как TypeErгог
или RangeError.
Ниже приводится пример метода rangelter,
возвращающего итератор, который выполняет итерации по целым числам в заданном диапазоне:
// Функция, возвращающая итератор диапазона целых чисел
function rangelter(first, last) {
let nextValue = Math.ceil(first);
return {
next: function {
if (nextValue > last) throw Stoplteration;
return nextValue++;
}
};
}
// Пример неудобной реализации итераций с помощью итератора диапазона,
let r = rangelter(1.5); // Получить объект-итератор
while(true) { // Теперь использовать его в цикле
try {
console.log(г.next); // Вызвать метод next итератора
catch(e) {
if (е == Stoplteration) break; // Завершить цикл по Stoplteration else throw e;
}
}
Обратите внимание, насколько неудобно использовать объект-итератор в цикле из-за необходимости явно обрабатывать исключение
Stoplteration
. Из-за этого неудобства итераторы редко используются на практике непосредственно. Чаще используются итерируемые объекты. Итерируемый объект представляет коллекцию значений, по которым можно выполнять итерации. Итерируемый объект должен определять метод с именем __iterator__
(с двумя символами подчеркивания в начале и в конце), возвращающий объект-итератор для коллекции. В JavaScript 1.7 в цикл
for/in
была добавлена возможность работы с итерируемыми объектами. Если значение справа от ключевого слова in является итерируемым объектом, то цикл for/in
автоматически вызовет его метод __iterator__,
чтобы получить объект-итератор. Затем он будет вызывать метод next
итератора, присваивать возвращаемое им значение переменной цикла и выполнять тело цикла. Цикл for/in
сам обрабатывает исключение Stoplteration
, и оно никогда не передается программному коду, выполняемому в цикле. Пример ниже определяет функцию range,
возвращающую итерируемый объект (а не итератор), который представляет диапазон целых чисел. Обратите внимание, насколько проще выглядит цикл for/in
при использовании итерируемого объекта диапазона по сравнению с циклом while
, в котором используется итератор диапазона.
Поделиться:
Популярные книги
Проданная Истинная. Месть по-драконьи
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Кодекс Охотника. Книга XXIII
23. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Вперед в прошлое 2
2. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Стражи душ
4. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Антимаг
1. Антимаг
Фантастика:
фэнтези
6.95
рейтинг книги
Второгодка. Книга 5. Презренный металл
5. Второгодка
Фантастика:
городское фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Я - злодейка в дораме. Сезон второй
2. Выжить в дораме
Фантастика:
уся
фэнтези
сянься
попаданцы
5.00
рейтинг книги
Я – Легенда 2: геном хищника
2. Я - Легенда!
Фантастика:
боевая фантастика
рпг
фантастика: прочее
попаданцы
5.00
рейтинг книги
Я не царь. Книга XXIV
24. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Последний Паладин. Том 5
5. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Изменяющий-Механик. Компиляция. Книги 1-18
Собрание сочинений
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Двойник короля 12
12. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 13
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Неучтенный элемент. Том 11
11. Антимаг. Вне системы
Фантастика:
фэнтези
5.00