JavaScript生成器函数(function*)通过yield实现按需产出值并自动返回符合迭代协议的对象,支持传参与双向通信,也可手动实现自定义Iterator。

JavaScript 中的 Iterator 可以通过生成器函数(function*)实现类似 Python 生成器的行为,核心是利用 yield 暂停执行、按需产出值,并自动返回符合迭代协议的对象。
生成器函数就是内置的 Iterator 工厂
定义一个生成器函数后,调用它不会立即执行,而是返回一个 generator object,该对象原生满足迭代协议(有 [Symbol.iterator]() 和 next() 方法),可直接用于 for...of、扩展运算符或手动调用 next()。
- Python 的
def my_gen(): yield 1; yield 2对应 JS 的function* myGen() { yield 1; yield 2; } - 调用
myGen()得到的 generator 就是可迭代对象,无需额外封装 - 每次
next()调用恢复函数执行,直到下一个yield或函数结束
支持传参与双向通信
生成器不仅能产出值,还能接收外部传入的值(通过 next(value)),实现类似 Python 中 generator.send() 的效果。
- 第一次
next()启动执行,参数被忽略(因尚未到达第一个yield) - 后续
next(value)中的value会成为上一个yield表达式的返回值 - 例如:
function* counter() { let n = 0; while (true) n = yield n++; },可用gen.next(10)把 10 赋给n
可手动实现自定义 Iterator(不依赖生成器)
若需更底层控制(比如封装非生成器逻辑),可直接返回含 next() 方法的对象,并确保其 [Symbol.iterator] 返回自身:
立即学习“Java免费学习笔记(深入)”;
const range = (start, end) => ({ [Symbol.iterator]() { return this; }, next() { return start- 这样创建的对象可直接用于
for...of,行为与生成器一致,但逻辑完全自主 - 注意:必须返回
{ value: ..., done: true|false }格式对象
与 Python 生成器的关键差异提醒
JS 生成器不可重用(遍历完即耗尽),且不支持 throw() 和 return() 的完整语义(虽有对应方法,但使用较少);Python 的 send()/throw() 更常见于协程场景。
- JS 中想“重启”生成器,需重新调用生成器函数获取新实例
- JS
yield*类似 Python 的yield from,用于委托子迭代器 - 异步场景推荐用
async function*,返回AsyncIterator,配合for await...of


















