遍历器(Iterator)是一种机制(接口):为各种不同的数据结构提供统一的访问机制,任何数据结构只要部署Iterator接口,就可以完成遍历操作for of循环,依次处理该数据结构的所有成员
- 拥有next方法用于依次遍历数据结构的成员
- 每一次遍历返回的结果是一个对象 {done:false,value:xxx}
- done:记录是否遍历完成
- value:当前遍历的结果
拥有Symbol.iterator属性的数据结构(值),被称为可被遍历的,可以基于for of循环处理
对象默认不具备Symbol.iterator,属于不可被遍历的数据结构
如果想让它可以迭代普通对象,我们应该咋做?答:手动给对象的原型上加一个Symbol.iterator迭代器接口
Object.prototype[Symbol.iterator] = function values() {
备注: Object.getOwnPropertySymbols() 能获取到symbol属性
let assemble = this,
keys = Object.keys(assemble).concat(Object.getOwnPropertySymbols(assemble)),
index = 0;
return {
next() {
if (index > keys.length - 1) {
return {
done: true,
value: undefined
};
}
let key = keys[index++];
return {
done: false,
value: assemble[key]
};
}
};
};
let obj = {
name: 'test',
age: 18,
0: 100,
1: 200
};
for (let value of obj) {
console.log('value', value);
}
value结果: 100,100,'test',18