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

}
                   );

                   var it = tasks[Symbol.iterator]();

                   it.next( 10 );          // step 1: 10
                                           // { value: 20, done: false }

                   it.next( 20, 50 );      // step 2: 20 50
                                           // { value:  120, done: false }

                   it.next( 20, 50, 120 ); // step 3: 20 50 120
                                           // { value: 1120, done: false }

                   it.next();              // { done: true }

               这种特定的用法强调了迭代器可以作为一个模式来组织功能,而不仅仅是数据。下一小节
               我们介绍生成器时也可以回顾一下这里。
               你甚至可以创造性地定义一个迭代器来表示单个数据上的元操作。举例来说,我们可以为
               数字定义一个迭代器,默认范围是从 0 到(或者对于负数来说,向下到)关注的数字。

               考虑:

                   if (!Number.prototype[Symbol.iterator]) {
                       Object.defineProperty(
                           Number.prototype,
                           Symbol.iterator,
                           {

                               writable: true,
                               configurable: true,
                               enumerable: false,
                               value: function iterator(){
                                   var i, inc, done = false, top = +this;

                                   // 正向还是反向迭代?
                                   inc = 1 * (top < 0 ? -1 : 1);

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

                                       next() {
                                           if (!done) {
                                               // 初始迭代总是0
                                               if (i == null){
                                                   i = 0;
                                               }
                                               // 正向迭代
                                               else if (top >= 0) {
                                                   i = Math.min(top,i + inc);
                                               }


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