什么是迭代器(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, 3Generator(生成器)
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, 3yield 委托
function* gen1() { yield 1; yield 2 }
function* gen2() { yield* gen1(); yield 3 }
for (const v of gen2()) console.log(v) // 1, 2, 3应用场景
- 自定义数据结构遍历
- 惰性求值(按需生成值,节省内存)
- 状态机
- async/await 的底层实现(Generator + 自动执行器)
// 无限序列
function* naturalNumbers() {
let n = 1
while (true) yield n++
}
const numbers = naturalNumbers()
numbers.next().value // 1
numbers.next().value // 2
// 不会内存溢出