for...of循环用于遍历部署了Iterator接口的可迭代对象,如数组、字符串、Map、Set等,直接获取值;自定义对象需实现[Symbol.iterator]方法才能支持。

ES6 的 for...of 循环专门用于遍历**部署了 Iterator 接口的可迭代对象**(如数组、字符串、Map、Set、类数组对象等),它直接获取值,不关心索引或键名,比 for...in 更语义清晰、更安全。
哪些对象能用 for...of?
只要对象满足以下任一条件,就可被 for...of 遍历:
- 原生内置类型:Array、String、Map、Set、TypedArray、arguments 对象、NodeList 等
- 实现了
[Symbol.iterator]方法的对象(返回一个符合 Iterator 协议的对象) - Generator 函数返回的生成器对象(本身就是一个迭代器)
基本语法与常见用法
语法简洁,直接解构出当前迭代值:
for (const value of iterable) {
console.log(value);
}
例如:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
-
遍历数组:
for (const item of [1, 2, 3]) {...}→ 依次得到1、2、3 -
遍历字符串:
for (const char of 'hello') {...}→ 按 Unicode 码点逐字符遍历(正确处理 emoji 和代理对) -
遍历 Map:
for (const [key, value] of map) {...}→ 直接解构键值对 -
遍历 Set:
for (const item of set) {...}→ 得到唯一值,无重复
如何让自定义对象支持 for...of?
只需在对象上定义 [Symbol.iterator] 方法,返回一个具有 next() 方法的对象:
const myIterable = {
items: ['a', 'b', 'c'],
[Symbol.iterator]() {
let index = 0;
return {
next: () => {
if (index < this.items.length) {
return { value: this.items[index++], done: false };
}
return { done: true };
}
};
}
};
for (const item of myIterable) {
console.log(item); // 'a', 'b', 'c'
}
注意事项与常见误区
for...of 不适用于普通对象(Object),因为 Object 默认没有 [Symbol.iterator] 接口。若强行使用会报错:TypeError: obj is not iterable。
- 想遍历对象的属性?用
Object.keys()、Object.values()或Object.entries()包一层再for...of -
for...of无法直接获取索引 —— 如需索引,改用entries()(如for (const [i, v] of arr.entries())) - 它不响应对象后续的修改(取决于迭代器实现),且不能跳出异步操作;如需中断,可用
break、continue或return(在函数内)

















