什么是迭代器(Iterator)和生成器(Generator)?

Iterator(迭代器)

迭代器是一个对象,实现了 next() 方法,返回 { value, done }。

function createIterator(arr) {
  let index = 0
  return {
    next() {
      return index < arr.length
        ? { value: arr[index++], done: false }
        : { value: undefined, done: true }
    }
  }
}

const it = createIterator([1, 2, 3])
it.next()  // { value: 1, done: false }
it.next()  // { value: 2, done: false }
it.next()  // { value: 3, done: false }
it.next()  // { value: undefined, done: true }

可迭代协议(Iterable)

实现了 [Symbol.iterator] 方法的对象可被 for...of 遍历:

const obj = {
  data: [1, 2, 3],
  [Symbol.iterator]() {
    let index = 0
    return {
      next: () => {
        return index < this.data.length
          ? { value: this.data[index++], done: false }
          : { value: undefined, done: true }
      }
    }
  }
}

for (const v of obj) console.log(v)  // 1, 2, 3

Generator(生成器)

function* 声明生成器函数,yield 暂停执行:

function* gen() {
  yield 1
  yield 2
  yield 3
}

const g = gen()
g.next()  // { value: 1, done: false }
g.next()  // { value: 2, done: false }
g.next()  // { value: 3, done: false }
g.next()  // { value: undefined, done: true }

for (const v of gen()) console.log(v)  // 1, 2, 3

yield 委托

function* gen1() { yield 1; yield 2 }
function* gen2() { yield* gen1(); yield 3 }

for (const v of gen2()) console.log(v)  // 1, 2, 3

应用场景

  1. 自定义数据结构遍历
  2. 惰性求值(按需生成值,节省内存)
  3. 状态机
  4. async/await 的底层实现(Generator + 自动执行器)
// 无限序列
function* naturalNumbers() {
  let n = 1
  while (true) yield n++
}
const numbers = naturalNumbers()
numbers.next().value  // 1
numbers.next().value  // 2
// 不会内存溢出

同分类其他题目