为什么要在Object 中添加 Iterator 属性?

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 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。

作用

  1. 为各种数据结构,提供一个统一的、简便的访问接口;
  2. 使得数据结构的成员能够按某种次序排列;
  3. 创造一种新的遍历命令for…of循环,Iterator 接口主要供for…of消费。

现在明白了,Iterator的产生主要是为了使用for…of方法。但具体Iterator概念还是有些抽象,如果要直接具体的描述的话:

Iterator其实就是一个具有 next()方法的对象,并且每次调用next()方法都会返回一个结果对象。

Iterator是一个特殊的对象:

  1. 它具有next()方法,调用该方法就会返回一个结果对象
  2. 结果对象有两个属性值:valuedone
  3. value表示具体的返回值;done是布尔类型,表示集合是否完成遍历,没有则返回true,否则返回false
  4. 内部有一个指针,指向数据结构的起始位置。每调用一次next()方法,指针都会向后移动一个位置,直到指向最后一个位置。