Iterator 的作用
为各种数据结构,提供一个统一的、简便的访问接口。
使得数据结构的成员能够按某种次序排列。
ES6提供了新的遍历命令for…of循环来消费Iterator 接口。
任何数据结构只要部署 Iterator 接口,就可以完成遍历操作。
即依次处理该数据结构的所有成员
Iterator接口
Symbol.iterator属性
以数组为例
let arr = ["a", "b", "c"];
let iter = arr[Symbol.iterator]();
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
实现iterator接口的自定义类示例
class RangeIterator {
constructor(start, stop, step) {
this.value = start;
this.stop = stop;
this.step = step;
}
[Symbol.iterator]() {
return this;
}
next() {
let value = this.value;
if (value < this.stop) {
this.value += this.step;
return { done: false, value: value };
}
return { done: true, value: undefined };
}
}
为对象添加 Iterator 接口示例
let obj = {
data: ["a", "b", "c"],
[Symbol.iterator]() {
const self = this;
let index = 0;
return {
next() {
if (index < self.data.length) {
return { value: self.data[index++], done: false};
} else {
return { value: undefined, done: true };
}
},
};
},
};
for (let d of obj) { console.log(d); }
通过Generator函数实现Iterator 接口迭代。
let obj = {
name1: "Tom",
name2: "Jerry",
name3: "Mickey",
name4: "Miney",
*[Symbol.iterator]() {
yield this.name1;
yield this.name2;
yield this.name3;
},
};
遍历器对象除了具有next方法,还可以具有return方法。
如果for…of循环提前退出(通常是因为出错,或者有break语句),就会调用return方法。如果一个对象在完成遍历前,需要清理或释放资源,就可以部署return方法
function* helloWorldGenerator() {
yield "hello";
yield "world";
return "ending";
}
let hw = helloWorldGenerator();
console.log(hw.next());
console.log(hw.next());
console.log(hw.next());
console.log(hw.next());