javascript生成器函数用function和yield实现惰性迭代,调用next()逐次执行并暂停,返回{value, done}对象;支持for...of自动遍历及yield委托其他迭代器。

JavaScript 中生成器函数通过 function* 语法和 yield 关键字实现按需迭代,它不会一次性计算全部值,而是在每次调用 next() 时才执行到下一个 yield 并暂停,真正做到了“用时才算”。
定义生成器函数:用 function* 和 yield
生成器函数不是普通函数,声明时函数名前加星号(*),内部用 yield 暂停执行并返回值。每次调用 next(),函数从上次暂停处继续,直到遇到下一个 yield 或函数结束。
例如,生成一个无限递增的自然数序列:
function* naturalNumbers() {
let i = 1;
while (true) {
yield i++;
}
}
调用后返回一个迭代器对象,不立即执行函数体:
const iter = naturalNumbers(); // 此时什么都没运行
手动控制迭代:调用 next() 获取值
迭代器对象提供 next() 方法,每次调用都推进一次执行,返回形如 { value: ..., done: true|false } 的对象。
-
value是本次yield后面的表达式结果 -
done为false表示还有更多值;true表示生成器已结束(遇到return或函数自然退出)
继续上面的例子:
console.log(iter.next()); // { value: 1, done: false }
console.log(iter.next()); // { value: 2, done: false }
console.log(iter.next()); // { value: 3, done: false }
因为是无限循环,done 始终为 false,所以必须由调用方控制何时停止。
配合 for...of 自动消费(推荐日常使用)
for...of 会自动调用迭代器的 next(),直到 done 为 true。对有限生成器非常简洁;对无限生成器则需提前 break。
function* range(start, end) {
for (let i = start; i for (const num of range(0, 5)) {
console.log(num); // 0, 1, 2, 3, 4
}
注意:for...of 不支持直接中断无限生成器,否则会死循环。安全做法是加条件退出:
let count = 0;
for (const n of naturalNumbers()) {
if (count >= 5) break;
console.log(n); // 1, 2, 3, 4, 5
count++;
}
利用 yield* 委托其他迭代器
yield* 可将当前生成器的执行权委托给另一个可迭代对象(如数组、其他生成器、字符串等),让它们的值“融入”当前序列,进一步提升组合性和复用性。
function* numbers() {
yield* [1, 2];
yield* range(3, 6);
yield* "ab";
}
<p>Array.from(numbers()); // [1, 2, 3, 4, 5, 'a', 'b']</p>
它不只是展开值,还会正确处理被委托对象的 done 状态,整个过程仍保持惰性——只有访问到某一项时,对应子迭代器才推进。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











