如何遍历对象_Javascript有哪些方法

推荐用 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...offorEach 即可安全遍历
  • 示例: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 键),不能只靠一种方法,要合并结果:

  • Object.getOwnPropertyNames(obj) → 获取所有自有字符串键(含不可枚举)
  • Object.getOwnPropertySymbols(obj) → 获取所有自有 Symbol 键
  • 用扩展运算符合并:[...Object.getOwnPropertyNames(obj), ...Object.getOwnPropertySymbols(obj)]
  • 再用 for...of 遍历这个混合数组,访问值时用 obj[key] 即可(Symbol 作键也支持)

避免直接用 for...in 不加过滤

不检查 hasOwnProperty() 会导致遍历到原型方法(如 toStringvalueOf),尤其在扩展原生原型或使用老旧库时极易出错。

  • 例如:Array.prototype.customMethod = function(){}; const arr = [1,2]; for (let k in arr) console.log(k); // 输出 0, 1, "customMethod"
  • 这种行为不是 bug,而是 for...in 的设计逻辑,所以过滤是必要步骤