for...of 可直接遍历数组、字符串、Set、TypedArray、Map(键值对)、arguments 和 NodeList 等原生可迭代对象;Map 需用 .values() 取纯值,Set 本身即遍历值;自定义对象需实现 [Symbol.iterator] 方法。

for of 循环直接遍历可迭代对象的值,不需要额外解构或索引访问,只要该对象实现了 [Symbol.iterator] 方法(即符合可迭代协议),就能用 for...of 逐个拿到它的值。
哪些对象可以直接用 for of 遍历值?
以下常见类型原生支持 for...of,循环变量自动接收每个元素的值:
- 数组:按索引顺序返回每个元素
- 字符串:按 Unicode 字符(非字节)逐个返回字符
-
Map:默认遍历
[key, value]数组(注意:是键值对,不是单个值) - Set:直接返回每个唯一值
- TypedArray(如 Uint8Array):返回每个数值元素
- arguments 对象、NodeList 等类数组对象(部分环境):需确认是否真正可迭代
想只取 Map 或 Set 的纯值?用内置方法辅助
Map 默认遍历的是键值对,如果只想获取值,推荐用 map.values();Set 本身遍历的就是值,无需处理:
const map = new Map([['a', 1], ['b', 2]]);
for (const value of map.values()) {
console.log(value); // 1, 2
}
const set = new Set([10, 20, 30]);
for (const val of set) {
console.log(val); // 10, 20, 30(就是值本身)
}
自定义对象如何支持 for of 遍历值?
只需在对象上部署 [Symbol.iterator] 方法,返回一个迭代器对象(含 next() 方法),每次调用返回 { value: ..., done: false/true }:
const myRange = {
from: 1,
to: 3,
[Symbol.iterator]() {
let current = this.from;
return {
next: () => {
if (current
<h3>注意避开常见误区</h3>
<p>以下情况不会按预期遍历“值”,需特别留意:</p>
-
普通对象({})不可直接 for of:它没有默认迭代器,会报错
TypeError: is not iterable - Map 直接 for of → 得到的是 [key, value] 数组,不是 key 或 value 单独出现
- for in 遍历的是属性名(key),不是值,和 for of 完全不同,别混淆
-
生成器函数返回的对象可迭代,可直接 for of,值由
yield决定
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











