for...of 可直接遍历 generator 返回的迭代器,因其原生实现 symbol.iterator;每次循环触发一次 yield,惰性求值适合流式处理;迭代器一次性消耗,重复遍历无效;异步 generator 需用 for await...of。

for...of 循环可以直接遍历 Generator 函数返回的迭代器对象,无需额外处理 —— 因为 Generator 本身就是一个符合 Symbol.iterator 协议的可迭代对象。
Generator 返回的就是一个迭代器
调用 Generator 函数(如 function* gen() { ... })不会立即执行函数体,而是返回一个 迭代器对象。这个对象自带 next() 方法,并实现了 [Symbol.iterator](),因此天然支持 for...of。
例如:
function* numberStream() {
yield 1;
yield 2;
yield 3;
}
<p>for (const n of numberStream()) {
console.log(n); // 依次输出 1, 2, 3
}
</p>可以边生成边消费,适合流式/异步场景
Generator 的惰性求值特性让 for...of 遍历时每次只触发一次 yield,适合处理大量数据、分页请求、或模拟数据流:
- 每轮循环自动调用
iterator.next(),拿到{ value, done } - 当
done === true时循环自动结束 - 中途可用
break或return提前退出,后续yield不会执行
注意:不能重复遍历同一个 Generator 实例
Generator 迭代器是一次性消耗品。一旦遍历完成(或中途退出),再次使用同一实例的 for...of 将无任何输出:
const iter = numberStream(); for (const n of iter) console.log(n); // 正常输出 1, 2, 3 for (const n of iter) console.log(n); // ❌ 什么也不输出(已耗尽)
如需多次遍历,应每次调用 numberStream() 创建新迭代器。
配合 async* 可遍历异步数据流(需在 async 函数中用 for await...of)
如果 Generator 是异步的(async function*),它返回的是一个 异步迭代器,此时必须用 for await...of:
async function* fetchPages() {
for (let i = 1; i // ✅ 正确方式
for await (const page of fetchPages()) {
console.log(page);
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











