要让普通对象支持for...of遍历,需部署Symbol.iterator方法,返回含next()的迭代器对象;next()必须返回{value, done}格式对象,done为true表示遍历结束。

在 JavaScript 中,让一个普通对象支持 for...of 遍历,关键不是改对象本身,而是给它装上符合迭代器协议的“发动机”——也就是实现 Symbol.iterator 方法。
对象必须部署 Symbol.iterator 方法
ES6 规定:只要一个对象拥有 [Symbol.iterator] 属性,且该属性是一个无参函数,返回值是符合迭代器协议的对象,那它就是可迭代的。这个方法就是遍历的入口。
- 它必须返回一个迭代器对象(即带
next()方法的对象) - 不能直接在对象上写
next,必须通过[Symbol.iterator]()返回那个带next的对象 - 浏览器和 Node.js 都原生支持
Symbol.iterator,无需 polyfill
next() 方法要返回标准结构
每次调用迭代器的 next() 方法,都必须返回一个形如 { value: ..., done: true|false } 的对象:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
value:当前步要输出的值;遍历结束时可为任意值,但通常设为
undefined -
done:布尔值;
false表示还有数据,true表示遍历完成 - 如果
next()返回的不是对象(比如null、false),会抛出TypeError
手写一个对象的自定义迭代器
比如有个班级对象,想让它直接遍历学生姓名:
立即学习“Java免费学习笔记(深入)”;
const klass = {
name: '三年二班',
students: ['小明', '小红', '小刚']
};
// 添加迭代器协议
klass[Symbol.iterator] = function () {
let index = 0;
return {
next: () => {
if (index < this.students.length) {
return { value: this.students[index++], done: false };
} else {
return { value: undefined, done: true };
}
}
};
};
// 现在可以 for...of 了
for (const name of klass) {
console.log(name); // 小明 → 小红 → 小刚
}
注意闭包与 this 绑定
上面例子中用了箭头函数或显式绑定 this,否则在 next 内部访问 this.students 可能出错。更稳妥写法是提前缓存引用:
- 用
const self = this在外层保存上下文 - 或把
students数组直接传进闭包作用域,避免依赖this - 生成器函数(
function*)能自动处理状态和this,适合复杂逻辑

















