推荐用 Object.keys() + for...of 遍历自有可枚举字符串键;for...in 必须配合 hasOwnProperty() 过滤继承属性;需包含 Symbol 键时,应合并 Object.getOwnPropertyNames() 和 Object.getOwnPropertySymbols() 结果。

遍历 JavaScript 对象有多种方式,核心在于区分“自有属性”和“继承属性”,以及是否需要处理 Symbol 类型的键。常用且安全的方法主要围绕 Object.keys()、Object.getOwnPropertyNames()、Object.getOwnPropertySymbols() 和 for...in 展开,配合 hasOwnProperty() 过滤是关键。
用 Object.keys() + for...of 遍历可枚举字符串键
这是最常用、推荐的方案:只获取对象自身可枚举的字符串属性名,不包含原型链上的属性,也不包含 Symbol 键。
-
Object.keys(obj)返回一个字符串数组,如['name', 'age'] - 配合
for...of或forEach即可安全遍历 - 示例:const obj = { name: 'Alice', age: 30 }; for (const key of Object.keys(obj)) { console.log(key, obj[key]); }
用 for...in + hasOwnProperty() 确保只遍历自有属性
for...in 会遍历对象自身及原型链上所有可枚举属性(包括字符串和 Symbol),容易误读继承属性,必须手动过滤。
- 每次循环中用
obj.hasOwnProperty(key)判断是否为自有属性 - 注意:它不处理 Symbol 键(Symbol 属性不会被
for...in遍历到) - 示例:for (const key in obj) { if (obj.hasOwnProperty(key)) { console.log(key, obj[key]); } }
遍历所有自有属性(含 Symbol)需组合使用
若需完整覆盖(字符串键 + Symbol 键),不能只靠一种方法,要合并结果:
立即学习“Java免费学习笔记(深入)”;
-
Object.getOwnPropertyNames(obj)→ 获取所有自有字符串键(含不可枚举) -
Object.getOwnPropertySymbols(obj)→ 获取所有自有 Symbol 键 - 用扩展运算符合并:[...Object.getOwnPropertyNames(obj), ...Object.getOwnPropertySymbols(obj)]
- 再用
for...of遍历这个混合数组,访问值时用obj[key]即可(Symbol 作键也支持)
避免直接用 for...in 不加过滤
不检查 hasOwnProperty() 会导致遍历到原型方法(如 toString、valueOf),尤其在扩展原生原型或使用老旧库时极易出错。
- 例如:Array.prototype.customMethod = function(){}; const arr = [1,2]; for (let k in arr) console.log(k); // 输出 0, 1, "customMethod"
- 这种行为不是 bug,而是
for...in的设计逻辑,所以过滤是必要步骤










