Чтение онлайн

на главную - закладки

Жанры

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
, в котором используется итератор диапазона.

Поделиться:
Популярные книги

Гримуар темного лорда III

Грехов Тимофей
3. Гримуар темного лорда
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар темного лорда III

Черный Маг Императора 5

Герда Александр
5. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 5

Искатель 2

Шиленко Сергей
2. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Искатель 2

Курсант: назад в СССР

Дамиров Рафаэль
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Курсант: назад в СССР

#Бояръ-Аниме. Газлайтер. Том 11

Володин Григорий Григорьевич
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11

Драйв Астарты

Розов Александр Александрович
5. Конфедерация Меганезия
Фантастика:
фэнтези
5.00
рейтинг книги
Драйв Астарты

Путь разума. Том 12

Морфиус
12. Путь Разума
Фантастика:
рпг
уся
фэнтези
сянься
5.00
рейтинг книги
Путь разума. Том 12

Третий Генерал: Тома I-II

Зот Бакалавр
1. Третий Генерал
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Третий Генерал: Тома I-II

Печать Пожирателя 3

Соломенный Илья
3. Пожиратель
Фантастика:
городское фэнтези
аниме
сказочная фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Печать Пожирателя 3

Хозяин Стужи 4

Петров Максим Николаевич
4. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Хозяин Стужи 4

Древесный маг Орловского княжества 3

Павлов Игорь Васильевич
3. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Древесный маг Орловского княжества 3

Дважды одаренный. Том II

Тарс Элиан
2. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Дважды одаренный. Том II

Полонянин

Гончаров Олег
2. Ночь Сварога
Приключения:
исторические приключения
8.30
рейтинг книги
Полонянин

Дважды одаренный. Том IV

Тарс Элиан
4. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
7.00
рейтинг книги
Дважды одаренный. Том IV