Skip to content
  • 遍历器(Iterator)是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。
  • Iterator的作用有三个:一是为各种数据结构,提供一个统一的、简便的访问接口;二是使得数据结构的成员能够按某种次序排列;三是ES6创造了一种新的遍历命令for...of循环,Iterator接口主要供for...of消费。
  • 在ES6中,有些数据结构原生具备Iterator接口(比如数组),即不用任何处理,就可以被for...of循环遍历,有些就不行(比如对象)。原因在于,这些数据结构原生部署了Symbol.iterator属性(详见下文),另外一些数据结构没有。凡是部署了Symbol.iterator属性的数据结构,就称为部署了遍历器接口。调用这个接口,就会返回一个遍历器对象。
  • 在ES6中,有三类数据结构原生具备Iterator接口:数组、某些类似数组的对象、Set和Map结构。
  • 一个为对象添加Iterator接口的例子。
javascript
{
  let arr = ['hello', 'world']
  let map = arr[Symbol.iterator]()
  console.log(map.next()) // { value: 'hello', done: false }
  console.log(map.next()) // { value: 'world', done: false }
  console.log(map.next()) // { value: undefined, done: true }
}

{
  let obj = {
    seart: [1, 3, 2],
    end: [7, 9, 8],
    [Symbol.iterator]() {
      let self = this
      let index = 0
      let arr = self.seart.concat(self.end)
      let len = arr.length
      return {
        next() {
          if (index < len) {
            return {
              value: arr[index++],
              done: false,
            }
          } else {
            return {
              value: arr[index++],
              done: true,
            }
          }
        },
      }
    },
  }
  for (let key of obj) {
    console.log(key) // 1,3,2,7,9,8
  }
}

{
  let arr = ['hello', 'world']
  for (let value of arr) {
    console.log('value', value)
    // value hello
    // value world
  }
}