Iterator

78 阅读2分钟

在web浏览器中没有Iterator这个类,但是,它有这个遍历器的规范

遍历器(Iterator) 是一种机制(接口):

为各种不同的数据结构提供统一的访问机制,任何数据结构只要部署了Iterator接口,就可以完成遍历操作,依次处理该数据结构的所有成员

1、怎么遍历数据结构的成员呢:拥有next方法,用来依次遍历成员

2、每一次遍历后,都会返回一个结果对象{done:false, value:xxx}

① done:记录是否遍历完成

② value:当前遍历的结果

实现:

class Iterator {
     constructor(assemble) {
         let self = this;
         // assemble 数字作为索引逐级递增
         // 拥有length属性存储集合的长度
         self.assemble = assemble;
         self.index = 0;
     }
     next() {
         let self = this,
             assemble = self.assemble,
             index = self.index;
 
         if (index > assemble.length - 1) {
             // 遍历结束了
             return {
                 done: true,
                 value: undefined
             }
         }
         
         return {
             done: false,
             value: assemble[self.index++]
         }
     }
 }
 

for of 内部是按照iterator.next 去迭代处理的。 所以,只有具备Symbol.iterator属性【具备Iterator迭代规范的】,才可以使用 for of 遍历。

给object上实现iterator

et obj = {
     0: 100,
     1: 200,
     2: 300,
     3: 400,
     length: 4,
     [Symbol.iterator]: function () {
         let self = this,
             index = 0;
 
         return { // 返回一个对象,对象上有next方法
             next() {
                 if (index > self.length - 1) {
                     return {
                         done: true,
                         value: undefined
                     }
                 }
                 return {
                     done: false,
                     value: self[index++]
                 };
             }
         };
     }
 };
 for(let item of obj) {
     console.log(item);
 }

总结:

Iterator接口:遍历数据结构

1、每一次遍历都会调用一下next方法

2、返回一个遍历后的结果:{done:是否还有元素, value:遍历到的元素}

for of内部按照这个接口实现的遍历规则

Symbol.iterator有这个属性的数据结构就可以使用for of遍历:

1、数组

2、类数组集合:arguments\NodeList……

3、String

4、Set

5、Map

6、generator object 生成器

7、……

Object默认是没有Symbol.iterator这个属性的,不能使用for of遍历