4、迭代器模式

33 阅读1分钟

迭代器模式:提供统一的方法来顺序访问集合对象(数组、对象、树等)的元素,而无需暴露该集合的内部表示。

普通迭代器:

const each = function(arr, cb) {
  for(let i = 0, l = arr.lenght; i < l; i++) {
    cb(i, arr[i], arr)
  }
}

each([1, 2, 3], function(index, item){
  console.log(index) // 0 1 2
  console.log(item) // 1 2 3
})

ES6 中,引入了迭代协议,用于创建迭代器对象,使用迭代器对象可以让其他对象可迭代

可迭代协议用来定义迭代行为,要求对象必须有[Symbol.Iterator]方法

迭代器协议用来定义具体的迭代操作,要求对象必须有next()方法

// 迭代器
class MyIterable {
  constructor(data) {
    this.data = data;
  }
  // 可迭代协议
  [Symbol.iterator]() {
    let index = 0;

    return {
      // 迭代器协议
      next: () => {
        if (index < this.data.length) {
          return { value: this.data[index++], done: false };
        } else return { done: true };
      },
    };
  }
}

// 可迭代的数据
const myArray = new MyIterable([1, 2, 3]);

// for...of 会自动调用迭代器协议来遍历可迭代对象。
for (let item of myArray) { 
  console.log(item); // 输出:1, 2, 3
}

总结:就是专门创建一个方法,支持循环访问集合