JavaScript迭代器和生成器是为统一遍历设计的机制:迭代器提供next()方法返回{value,done},生成器函数(function*)用yield简化迭代器创建;对象实现[Symbol.iterator]()即符合迭代器协议。
Jav
aScript 中的迭代器和生成器函数,本质是为统一遍历行为而设计的语言机制。迭代器对象提供 next() 方法,返回 { value, done } 形式的结构;生成器函数则是创建迭代器的便捷语法糖,用 function* 声明,内部用 yield 暂停执行并产出值。
任何对象只要拥有符合规范的 [Symbol.iterator]() 方法,并返回一个带 next() 的对象,就是可迭代的。
例如,让一个普通对象支持 for...of:
const myRange = {
from: 1,
to: 3,
[Symbol.iterator]() {
let current = this.from;
return {
next() {
if (current <= this.to) {
return { value: current++, done: false };
} else {
return { value: undefined, done: true };
}
}
};
}
};
for (const num of myRange) console.log(num); // 1, 2, 3
生成器函数调用后不立即执行,而是返回一个迭代器对象。每次调用 next(),函数从上次暂停处继续,直到下一个 yield 或结束。
关键点:
yield 表达式本身有返回值,可通过下一次 next(arg) 传入参数接收return 会令 done: true,其值作为最终 value
for...of、扩展运算符([...gen()])、解构等使用生成器天然适合处理大数据流或分步任务:
next() 获取一页数据co 库或自定义 runner 结合,实现类似 async/await 的同步写法(早于 async/await 出现)生成器一旦执行完毕(done: true),后续调用 next() 总是返回 { value: undefined, done: true };throw() 和 return() 方法可用于提前终止或注入错误;不能直接 new 生成器函数——它不是构造器。