要让自定义对象支持 for...of 遍历,必须手动实现 [symbol.iterator] 方法,返回一个具有 next() 方法的迭代器对象;该方法可使用生成器函数简化实现,并能自定义遍历内容、顺序及条件,每次调用应返回新迭代器以支持多次遍历。

要让自定义对象支持 for...of 遍历,必须手动实现 [Symbol.iterator] 方法,返回一个符合迭代器协议的对象(即有 next() 方法)。
让对象可被 for...of 遍历
JavaScript 的 for...of 循环只认「可迭代对象」,也就是拥有 [Symbol.iterator] 方法、且该方法返回迭代器的对象。自定义对象默认没有这个能力,需要自己加。
- 在对象上定义一个名为
[Symbol.iterator]的方法(注意方括号是语法必需的) - 这个方法必须返回一个对象,该对象有
next()方法 -
next()每次调用应返回形如{ value: ..., done: true/false }的对象
简单示例:遍历对象的键
比如想让一个普通对象能用 for...of 直接遍历它的所有键:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const obj = {
a: 1,
b: 2,
c: 3
};
<p>obj[Symbol.iterator] = function* () {
for (const key of Object.keys(this)) {
yield key;
}
};</p><p>for (const key of obj) {
console.log(key); // 输出 'a', 'b', 'c'
}</p>
这里用了生成器函数(function*),它天然返回符合迭代器协议的对象,写起来更简洁。当然也可以手写 next 方法,但生成器更推荐。
控制遍历内容和顺序
[Symbol.iterator] 完全由你定义,可以返回键、值、键值对,甚至任意逻辑生成的数据:
- 返回值:
yield this[key] - 返回
[key, value]对:yield [key, this[key]] - 只遍历满足条件的属性:
if (key.startsWith('data_')) yield this[key] - 支持多次遍历:每次调用
[Symbol.iterator]都应返回新迭代器,避免状态污染
注意事项
别忘了几个关键点:
-
Symbol.iterator是 Symbol 类型,不能写成字符串"Symbol.iterator" - 如果对象已有原型链上的
[Symbol.iterator](比如数组),会优先使用原型上的,除非你显式覆盖 - 类中定义更清晰:
class MyList { *[Symbol.iterator]() { ... } } - 不支持解构或扩展运算符(如
[...obj])除非实现了该接口——而[Symbol.iterator]正是它们依赖的
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










