生成器函数是可迭代对象的最简捷实现,自动满足迭代协议;它返回的迭代器对象既有next()方法又自带[symbol.iterator](),支持for...of等所有可迭代语法,且比手动实现更清晰、不易出错。

迭代器与生成器函数在 JavaScript 中天然一体——生成器函数本身就是可迭代对象的最简捷实现方式,它自动满足迭代协议,无需手动编写 Symbol.iterator 方法。
生成器函数默认返回迭代器
调用 function* 定义的函数,返回值就是一个迭代器对象。这个对象既有 next() 方法,又自带 [Symbol.iterator](),因此既可手动调用 .next(),也能直接用于 for...of、扩展运算符、解构等所有接收可迭代对象的语法。
function* nums() { yield 1; yield 2; }-
const it = nums();→it是迭代器,it.next()返回{ value: 1, done: false } -
it[Symbol.iterator]() === it为true,说明它自己就是自己的迭代器工厂
生成器替代手写迭代器
相比手动实现 Symbol.iterator 方法(需维护状态、判断边界、返回 {value, done}),生成器把逻辑扁平化、声明式地表达出来,代码更清晰、不易出错。
- 手写:要定义闭包变量、
next方法体、done判断逻辑 - 生成器:用
yield直接“产出”每个值,执行顺序和暂停点一目了然 - 例如实现一个范围迭代器:
function* range(start, end) { for (let i = start; i ,比手动构造迭代器少写十行以上且更易读
生成器让任意对象可迭代
只需在对象上部署 [Symbol.iterator],其值设为一个生成器函数,该对象立刻变成可迭代对象。
const obj = { a: 1, b: 2, c: 3 };obj[Symbol.iterator] = function* () { for (const key of Object.keys(this)) yield [key, this[key]]; };- 之后就能
for (const [k, v] of obj) console.log(k, v);
生成器支持状态保持与按需计算
每次 yield 暂停时,函数上下文(局部变量、执行位置)被完整保留;下次 next() 调用时从断点恢复。这使得生成器天然适合惰性序列、分页数据、状态机等场景。
- 例如无限斐波那契:
function* fib() { let a = 0, b = 1; while (true) { yield a; [a, b] = [b, a + b]; } - 只在需要时计算下一个数,不占内存存整个序列
- 配合
take(5)类工具,轻松截取前几项
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











