for-of循环专为遍历可迭代对象设计,依赖symbol.iterator接口;array、string、map、set等原生支持,map/set提供keys()/values()/entries()方法,普通对象需手动实现迭代器,区别于遍历属性名的for-in。

for-of 循环专为遍历“可迭代对象”(iterable)而设计,它不关心数据结构内部怎么存,只认一个标准接口:Symbol.iterator。只要对象实现了这个方法并返回一个符合迭代器协议的对象(有 next() 方法,返回 {value, done}),就能用 for-of 遍历。
哪些数据结构天生支持 for-of
以下类型默认部署了 Symbol.iterator,开箱即用:
- Array:按索引顺序逐个取值
- String:按 Unicode 字符(不是字节)遍历,正确处理 emoji 和代理对
-
Map:每次迭代返回
[key, value]数组,可用解构直接获取 - Set:按插入顺序遍历唯一值
-
TypedArray(如
Uint8Array)、arguments、NodeList:也原生可迭代
如何遍历 Map 和 Set 的键或值
Map 和 Set 提供了专门的迭代方法,比直接遍历更灵活:
-
map.keys()→ 遍历所有键 -
map.values()→ 遍历所有值 -
map.entries()→ 默认行为,等价于直接用 for-of -
set.values()或set.keys()(两者相同)→ 遍历所有元素
示例:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
const map = new Map([['a', 1], ['b', 2]]); for (const key of map.keys()) console.log(key); // 'a', 'b' <p>const set = new Set(['x', 'y']); for (const val of set.values()) console.log(val); // 'x', 'y'</p>
普通对象怎么用 for-of 遍历
对象本身不可迭代,因为属性无固有顺序。但你可以手动添加 Symbol.iterator 方法,定义你想怎么线性化它:
- 按属性值遍历:
Object.values(obj)包装后迭代 - 按属性名遍历:
Object.keys(obj)包装后迭代 - 自定义逻辑:比如只遍历自有属性、按特定顺序、或组合键值对
简单写法示例(遍历自有属性值):
const obj = { x: 10, y: 20 };
obj[Symbol.iterator] = function* () {
for (const key of Object.keys(this)) {
yield this[key];
}
};
for (const val of obj) console.log(val); // 10, 20注意 for-of 和 for-in 的关键区别
别混淆两者:
-
for-in遍历对象的**可枚举属性名**(包括原型链上的),适合老式对象遍历 -
for-of遍历对象的**可迭代值**,依赖Symbol.iterator,不处理属性名,也不访问原型链 - 数组用
for-in会把索引当字符串遍历,还可能漏掉稀疏项;for-of只取实际元素,更安全直观










