Page 157 - 你不知道的JavaScript(下卷)
P. 157

当然,可以有意地把迭代器设计为在返回 done: true 的同时返回一些相关
                          值。但除非已经写了文档表明这一点,以此迫使迭代器的消费者使用不同的
                          迭代模式,而不是像 for..of 或者其等价手动 for 形式暗示的那样,否则不
                          要这么做。



               3.1.5 自定义迭代器
               除了标准的内置迭代器,你也可以构造自己的迭代器!要使得它们能够与 ES6 的消费者工
               具(比如,for..of 循环以及 ... 运算符)互操作,所需要做的就是使其遵循适当的接口。

               让我们试着构造一个迭代器来产生一个无限斐波纳契序列:

                   var Fib = {
                       [Symbol.iterator]() {
                           var n1 = 1, n2 = 1;

                           return {
                               // 使迭代器成为iterable
                               [Symbol.iterator]() { return this; },

                               next() {
                                   var current = n2;
                                   n2 = n1;
                                   n1 = n1 + current;
                                   return { value: current, done: false };
                               },

                               return(v) {
                                   console.log(
                                       "Fibonacci sequence abandoned."
                                   );
                                   return { value: v, done: true };
                               }
                           };
                       }
                   };

                   for (var v of Fib) {
                       console.log( v );

                       if (v > 50) break;
                   }
                   // 1 1 2 3 5 8 13 21 34 55
                   // Fibonacci sequence abandoned.



                          如果我们没有插入 break 条件的话,这个 for..of 循环就会无限循环下去,
                          这可能不是你想要的结果。




               134   |   第 3 章
                                图灵社区会员 avilang(1985945885@qq.com) 专享 尊重版权
   152   153   154   155   156   157   158   159   160   161   162