for-of 循环用于遍历可迭代对象,要求对象实现[Symbol.iterator]方法,支持Array、String、Map、Set等;不可直接遍历普通对象,需通过Object.keys/values/entries转换。

for-of 循环是 JavaScript 中专门用于遍历可迭代对象(Iterable)的语法,它比传统 for 循环更简洁,比 for-in 更安全(不遍历原型链和非数值属性),且原生支持数组、字符串、Map、Set、arguments、NodeList 等常见数据结构。
哪些对象能用 for-of?
只要对象实现了 [Symbol.iterator] 方法,就是可迭代对象。常见内置类型包括:
- Array(数组)
- String(字符串,按 Unicode 码点遍历)
- Map(遍历的是 [key, value] 数组)
- Set(遍历每个唯一值)
- TypedArray(如 Uint8Array)
- arguments 对象(函数内)
- DOM 的 NodeList、HTMLCollection(现代浏览器中)
基本写法与示例
语法很简单:for (const item of iterable) { ... }。每次循环,item 接收当前迭代值。
例如遍历数组:
立即学习“Java免费学习笔记(深入)”;
const arr = ['a', 'b', 'c'];
for (const item of arr) {
console.log(item); // 'a', 'b', 'c'
}
遍历字符串(注意处理 Unicode 字符,比如 emoji 或代理对):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
for (const char of '??') {
console.log(char); // 正确输出一个 emoji,不会被拆成代理对
}
遍历 Map 时,默认返回键值对数组:
const map = new Map([['name', 'Alice'], ['age', 30]]);
for (const [key, value] of map) {
console.log(`${key}: ${value}`); // 'name: Alice', 'age: 30'
}
配合解构、break/continue 和 await 使用
for-of 天然支持解构赋值,也兼容异步操作(需在 async 函数中):
- 用解构快速提取值:for (const [i, val] of arr.entries()) {...}(entries() 返回索引和值)
- 提前退出用 break;跳过本次用 continue
- 配合 await 遍历异步可迭代对象(如自定义 AsyncIterator 或某些库返回的 async iterable)
示例(带索引):
const colors = ['red', 'green', 'blue'];
for (const [index, color] of colors.entries()) {
console.log(`${index}: ${color}`);
}
不能直接遍历普通对象
Plain object(如 {a:1, b:2})默认不可迭代,for-of 会报错:TypeError: obj is not iterable。如需遍历对象属性,可转成可迭代形式:
- Object.keys(obj) → 遍历键
- Object.values(obj) → 遍历值
- Object.entries(obj) → 遍历 [key, value]
- 或手动添加 Symbol.iterator 实现(较少用)
正确写法示例:
const obj = {x: 10, y: 20};
for (const [key, value] of Object.entries(obj)) {
console.log(`${key} = ${value}`); // 'x = 10', 'y = 20'
}

















