生成器是创建迭代器的便捷方式,自动满足迭代器协议并支持for...of等语法;异步生成器配合for await...of实现边获取边处理;yield*可委托递归遍历,无限序列只需while(true) yield。

JavaScript 迭代器与生成器的协同工作,本质是“协议 + 实现”的配合:生成器自动满足迭代器协议,而迭代器协议让生成器能被标准语法(如 for...of)直接消费。它们不是并列工具,而是上下层关系——生成器是创建迭代器的便捷方式。
生成器函数天然返回符合协议的迭代器对象
用 function* 声明的函数,调用后不执行逻辑,而是立即返回一个生成器对象。这个对象本身既是迭代器(有 next() 方法),也是可迭代对象(其 [Symbol.iterator]() 方法返回自身)。无需手动实现 next() 或挂载 Symbol.iterator,一切由引擎保障。
- 每次调用
next(),函数从暂停处恢复,执行到下一个yield或结束 -
yield后的表达式值成为next().value,函数状态冻结等待下一次调用 - 函数返回或抛出未捕获异常时,
done变为true
可迭代协议让生成器无缝接入语言生态
只要一个对象有 [Symbol.iterator] 方法且返回迭代器,它就能用于 for...of、扩展运算符、Array.from() 等。生成器对象自带该方法,因此:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
-
for (const x of myGenerator()) { ... }可直接遍历 -
[...myGenerator()]会逐次调用next()收集所有value -
Array.from(myGenerator())效果同上,但支持映射回调
异步场景中:async function* + for await...of 构成完整链条
异步生成器(async function*)返回的是异步迭代器,它遵循异步迭代协议:next() 返回 Promise<{ value, done }>。此时普通 for...of 不适用,必须用 for await...of —— 它会自动 await 每个 next() 的返回值。
立即学习“Java免费学习笔记(深入)”;
- 每个
yield可以跟 Promise,例如yield fetch(url).then(r => r.json()) - 循环体内部代码按顺序执行,无需显式
await,语义清晰 - 适合分页请求、日志流、数据库游标等“边获取边处理”场景
手动实现迭代器时,生成器可大幅简化逻辑
当需要自定义遍历行为(如树的深度优先、过滤后遍历、带状态的序列),手动写 next() 易出错且冗长。生成器用同步风格描述流程,把状态管理交给引擎:
- 避免维护
currentIndex、done标志、边界判断等样板代码 - 递归结构(如遍历嵌套菜单)可用
yield*委托,代码扁平易读 - 无限序列(如 ID 生成器、时间戳流)只需
while(true) { yield ... }

















