在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遍历