Page 204 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 204
it . n ext ( ) ; 1 1 va lue : "Twinkle, twinkle, l i t t le ba t ! ", don e : false }
e
'
i t . n ext ( ) ; 1 1 va lue : "How I wonder wha t you r e a t ! ", don : false }
i t . n ext ( ) ; 1 1 va lue : "Ир above the wor ld you f 1 у, ", done : false }
i t . n ext ( ) ; 1 1 value : "Like а t e a tray in the sky. " done : false }
'
it . n ext ( ) ; 1 1 value : "Twinkl e , twinkle , l i t t le ba t ! ", done : false
e
i t . n ext ( ) ; 1 1 value: "How I wonder wha t you ' r e a t ! ", don : false }
it . next ( ) ; 1 1 value: undefined, don e : true
it . next ) ; 1 1 va lue: undefined, done : true
(
n
it . n ext ( ) ; 1 1 value : undefined, do e : true
Здесь есть несколько важных моментов, на которые стоит обратить внимание.
Прежде всего, когда метод next возвращает последнюю страницу книги, он не ука
зывает, что это конец. Здесь аналогия с книгой немного нарушается: читая послед
нюю страницу книги, вы знаете, что она последняя, правильно? Итераторы применя
ются не для книг, и не всегда настолько просто узнать, когда вы закончили. Обратите
внимание, что по завершении свойство value имеет значение undefined и вы можете
продолжать вызывать метод next и он будет продолжать возвращать то же самое.
Как только итератор достигает конца, он в буквальном смысле достигает конца на
бора данных, и больше не должен возвращать никаких данных.2
Хотя в этом примере и не показано все непосредственно, вам уже должно быть
(
t
понятно, что между вызовами метода i . next ) можно выполнять некие действия.
Другими словами, итератор i t всегда хранит указатель на текущее место.
Если нужно перебрать массив, можно использовать цикл for или цикл for . . of.
.
Механика цикла for проста: известно, что элементы массива пронумерованы и по
следовательны, поэтому мы можем использовать индексную переменную для доступа
к каждому элементу массива по очереди. А как насчет цикла for . . . оН Как он делает
.
свою работу без индекса? Оказывается он использует итератор: цикл for . . of будет
работать с любЬtм объектом, который предоставляет итератор. Мы скоро увидим, как
использовать это в своих интересах. Сначала давайте рассмотрим, как мы можем сэму
.
лировать цикл for . . of, используя цикл while и наше обретенное знание итераторов.
k
const it = boo . values ( ) ;
let current = i t . n ext ( ) ;
while ( ! current . d one ) {
console . l og ( c urrent . v alu ) ;
e
current = i t . next ( ) ;
Обратите внимание, что итераторы индивидуальны, т.е. каждый раз, создавая но
вый итератор, вы начинаете с начала и вполне можете получить несколько итерато
ров, которые отмечают разные места.
2 Поскольку объекты сами отвечают за предоставление собственного итеративного механизма, как
мы увидим вскоре, фактически вполне возможно создать "плохой итератор': в котором значение
свойства done изменено на обратное; такой итератор считался бы дефектным. Вообще, вы должны
полагаться на правильное поведение итератора.
206 Глава 1 2 . Итераторы и генераторы

