迭代器模式:提供统一的方法来顺序访问集合对象(数组、对象、树等)的元素,而无需暴露该集合的内部表示。
普通迭代器:
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
}
总结:就是专门创建一个方法,支持循环访问集合