for...of可直接遍历字符串但不能直接遍历普通对象;字符串按Unicode码点遍历,正确处理emoji和代理对;普通对象需用Object.keys()、Object.values()或Object.entries()配合for...of,或手动添加[Symbol.iterator]方法。

for...of 可以直接遍历字符串,但不能直接遍历普通对象(即 plain object),因为普通对象默认不可迭代。
遍历字符串:天然支持
字符串在 JavaScript 中是可迭代的,for...of 会按 Unicode 码点逐个访问字符(正确处理 emoji 和代理对):
const str = 'hello ?';
for (const char of str) {
console.log(char); // 'h', 'e', 'l', 'l', 'o', ' ', '?'
}注意:它比 for...in 更安全——不会遍历原型属性,也不受字符串被“类数组化”影响;也比传统 for 循环更简洁,且自动处理 UTF-16 代理对。
遍历普通对象:需手动提供迭代协议
普通对象(如 {a: 1, b: 2})没有默认的 [Symbol.iterator] 方法,因此直接写 for (const k of obj) 会报错:TypeError: obj is not iterable。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
若想用 for...of 遍历对象的键、值或条目,需借助内置的迭代方法:
-
遍历键:用
Object.keys(obj) -
遍历值:用
Object.values(obj) -
遍历 [key, value] 对:用
Object.entries(obj)
const obj = { x: 10, y: 20 };
<p>for (const key of Object.keys(obj)) {
console.log(key); // 'x', 'y'
}</p><p>for (const value of Object.values(obj)) {
console.log(value); // 10, 20
}</p><p>for (const [key, value] of Object.entries(obj)) {
console.log(<code>${key}: ${value}</code>); // 'x: 10', 'y: 20'
}进阶:让普通对象自己支持 for...of
可以给对象手动添加 [Symbol.iterator] 方法,使其变成可迭代对象。例如,让它默认遍历键:
const obj = { a: 1, b: 2 };
obj[Symbol.iterator] = function* () {
yield* Object.keys(this);
};
<p>for (const k of obj) {
console.log(k); // 'a', 'b'
}这种写法适用于自定义数据结构,但日常开发中更推荐明确使用 Object.keys() 等方法,语义清晰、无需修改原对象。
别和 for...in 混淆
for...in 遍历对象的**可枚举自身及继承属性名**(包括原型链上的),而 for...of + Object.keys() 只遍历对象自身的可枚举键,且顺序确定(按插入顺序)。所以处理普通对象时,优先选 Object.keys(obj) 配合 for...of,更可靠、更现代。

















