ES6 中引入 Iterator 属性,具有原生Iterator接口的有 Array, Set, Map等。
但是Object 中没有,因为Object中的属性没有确定的先后顺序。
但是可以人为加入 Iterator 属性 (根据阮一峰:ES6标准入门 P303)
let obj = {
data: ['hello', 'world'],
[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,
}
}
}
}
}
}
这时候对 obj 使用 let... of 就能作用了
for (let item of obj){
console.log(item)
}
// 'hello'
// 'world'
但是如果我们对`data`属性进行改变,
data: 'hello',
这时候就是当做字符串遍历,而之前是当做数组遍历
// 'h'
// 'e'
// 'l'
// 'l'
// 'o'
如果我们添加其他属性
data: ['hello', 'world'],
name: ['John', 'Lisa'],
遍历的结果仍旧是只有 'hello'和'world'.
我的问题是, 在 Object 中添加 Iterator·属性的作用是在哪里?有什么应用的场景吗?
它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。
作用
现在明白了,Iterator的产生主要是为了使用for…of方法。但具体Iterator概念还是有些抽象,如果要直接具体的描述的话:
Iterator其实就是一个具有 next()方法的对象,并且每次调用next()方法都会返回一个结果对象。
Iterator是一个特殊的对象:
value
和done
。value
表示具体的返回值;done是布尔类型,表示集合是否完成遍历,没有则返回true,否则返回false