要让自定义对象支持for-of遍历,需在对象上部署[symbol.iterator]方法,该方法返回符合迭代器协议的对象(含next(),返回{value, done});可用直接挂载、类封装或生成器函数实现,并通过for-of、扩展运算符或手动调用验证。

让自定义对象支持 for-of 遍历,关键是在对象上部署 [Symbol.iterator] 方法,该方法必须返回一个符合迭代器协议的对象——即带有 next() 方法,且每次调用都返回形如 { value, done } 的对象。
给对象直接添加 Symbol.iterator 方法
最直观的方式是把 [Symbol.iterator] 作为方法挂载到对象自身或其原型上。这个方法不接收参数,返回的必须是一个“迭代器对象”。
-
迭代器对象必须有
next()方法; -
next()每次调用返回{ value: 当前值, done: 布尔值 }; -
done: true表示遍历结束,此时value通常为undefined(也可省略); - 常见做法是用闭包保存当前状态(比如索引、节点引用等),确保多次调用
next()能延续进度。
用类封装并实现可迭代接口
如果对象来自类(比如链表、区间、自定义集合),推荐在类的原型上定义 [Symbol.iterator]。这样所有实例都能复用同一套遍历逻辑。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 类内部可维护遍历所需的私有状态(如当前节点、起始/结束值);
-
[Symbol.iterator]()中初始化状态,并返回一个带next()的轻量对象; - 避免在
next()外部暴露内部结构,保持封装性; - 例如链表遍历时,
next()只需移动指针并返回当前节点值,不暴露next属性。
用生成器函数简化实现
生成器函数(function*)天然满足迭代器协议:每遇到 yield 就返回 { value: ..., done: false };函数执行完毕自动返回 { done: true }。
- 写法简洁,无需手动管理
done和状态变量; - 支持异步迭代(配合
async function*和for await...of); - 适合需要惰性计算、无限序列或复杂控制流的场景;
- 注意:生成器函数返回的是迭代器对象,可直接赋给
[Symbol.iterator]。
验证是否成功实现
部署完 [Symbol.iterator] 后,可通过几种方式确认是否生效:
- 用
for (const x of obj) { ... }测试是否能正常循环; - 尝试扩展运算符:
[...obj]应得到展开后的数组; - 手动调用:
const it = obj[Symbol.iterator](); it.next()查看返回结构; - 检查
obj[Symbol.iterator]是否为函数,且typeof it.next === 'function'。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










