for-of 循环原生支持符合迭代协议的对象,包括 generator 函数返回的生成器;自定义类需实现 [symbol.iterator] 方法;生成器对象仅可单次遍历,多次使用需重新调用函数获取新实例。

JavaScript 中的 for-of 循环原生支持任何具有 迭代协议(iteration protocol) 的对象,包括自定义 Generator 函数返回的生成器对象。你不需要额外处理——只要函数用 function* 定义并 yield 值,它返回的生成器就天然可被 for-of 消费。
确保 Generator 函数正确声明和调用
Generator 函数必须使用 function* 语法,并在调用时返回一个生成器对象(而非直接执行)。for-of 内部会自动调用该对象的 [Symbol.iterator]() 方法(生成器对象已内置实现)。
- ✅ 正确写法:
function* myGen() { yield 1; yield 2; },然后for (const x of myGen()) { ... } - ❌ 错误写法:
function myGen() { return function*() { ... }; }—— 这返回的是一个函数,不是生成器对象
自定义类中支持 for-of:手动实现 @@iterator 方法
如果你希望某个普通类(非 Generator 函数)也能被 for-of 遍历,需在类上部署 [Symbol.iterator] 方法,并让它返回一个符合迭代器协议的对象(可以是生成器实例)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 推荐做法:在
[Symbol.iterator]中return this[Symbol.iterator] = function*() { ... }();或直接return this.values();(若已有生成器方法) - 示例:class Countdown { constructor(n) { this.n = n; } *[Symbol.iterator]() { for (let i = this.n; i > 0; i--) yield i; } }
for (const n of new Countdown(3)) console.log(n); // 输出 3, 2, 1
注意生成器只能消费一次
生成器对象是**单次遍历**的。一旦被 for-of 走完,再次遍历时不会重新开始,而是立即结束(因为内部迭代器状态已到 done: true)。
- 若需多次遍历,每次都要调用 Generator 函数获取新生成器:
for (const x of gen()) { ... },而不是复用const iter = gen(); for (...) { ... } - 调试时可用
Array.from(gen())或[...gen()]快速展开,但同样消耗一次迭代
与普通可迭代对象保持一致:返回 { value, done }
虽然 Generator 自动满足协议,但理解底层结构有助于排查问题。迭代器协议要求 next() 返回形如 { value: ..., done: true|false } 的对象。生成器的 next() 就是这么工作的,所以它和 Array.prototype[Symbol.iterator]() 行为一致。
- 可手动验证:
const g = myGen(); console.log(g.next()); // { value: 1, done: false } -
for-of底层就是反复调用next()直到done: true
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










