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 .   Итераторы  и  генераторы
   199   200   201   202   203   204   205   206   207   208   209