下面整理一份 《JavaScript 中遍历对象的所有常用方法(最全汇总版)》,覆盖 ES5 → ES6+ → 高级技巧,让你在任何场景都能选对方法。


🚀 JavaScript遍历对象的所有方法(最全总结)

对象遍历 ⬇ 可以分为 键(key)遍历值(value)遍历[key,value] 组合遍历可枚举/不可枚举/原型链遍历 等场景。

下面逐条列出示例与适用范围。


⭐ 1. for…in(可遍历原型链)

const obj = { a: 1, b: 2 };
for (let key in obj) {
  console.log(key, obj[key]);
}

✔ 特点

  • 遍历 可枚举属性
  • 包含原型链上的属性
  • 需要 hasOwnProperty 过滤
for (let key in obj) {
  if (obj.hasOwnProperty(key)) {
    console.log(key, obj[key]);
  }
}


⭐ 2. Object.keys()(只遍历自身可枚举属性)

Object.keys(obj).forEach(key => {
  console.log(key, obj[key]);
});

✔ 特点

  • 返回 自身可枚举属性 的数组
  • 不包含 Symbol 和原型链
  • 使用频率最高

⭐ 3. Object.values()(遍历值)

Object.values(obj).forEach(v => {
  console.log(v);
});

✔ 特点

  • 只遍历对象的值
  • 不包括 key

⭐ 4. Object.entries()(键值对遍历)

for (let [key, value] of Object.entries(obj)) {
  console.log(key, value);
}

✔ 特点

  • 键值对形式
  • 常用于转换 Map、构建表格、序列化等

⭐ 5. Object.getOwnPropertyNames()(包括不可枚举属性)

Object.getOwnPropertyNames(obj).forEach(key => {
  console.log(key, obj[key]);
});

✔ 特点

  • 包括:可枚举 + 不可枚举
  • 不包括 Symbol

适合需要获取 隐藏属性 时使用。


⭐ 6. Object.getOwnPropertySymbols()(遍历 Symbol 属性)

Object.getOwnPropertySymbols(obj).forEach(key => {
  console.log(key, obj[key]);
});

✔ 特点

  • 专门用于 Symbol 键
  • 不包含普通键

⭐ 7. Reflect.ownKeys()(最全属性遍历)

Reflect.ownKeys(obj).forEach(key => {
  console.log(key, obj[key]);
});

✔ 特点

  • 包含所有属性:
    • 可枚举
    • 不可枚举
    • Symbol
  • 最强大的对象遍历方法

适合作:序列化、框架底层、代理等高级功能


⭐ 8. Object.getPrototypeOf() + 遍历原型链

let current = obj;
while (current) {
  console.log("原型:", current);
  current = Object.getPrototypeOf(current);
}

用于调试、手写继承、序列化。


⭐ 9. for…of(用于 Map、Object.entries 等间接遍历)

for (let [key, value] of Object.entries(obj)) {
  console.log(key, value);
}

for...of 本身不能遍历普通对象(除非你实现 iterator)。


⭐ 10. 使用 Map/WeakMap 遍历对象结构

const map = new Map(Object.entries(obj));
map.forEach((v, k) => console.log(k, v));

用于将对象转换为可遍历结构。


⭐ 11. 递归遍历嵌套对象(深度遍历)

function deepTraverse(o) {
  for (let k in o) {
    if (o.hasOwnProperty(k)) {
      console.log(k, o[k]);
      if (typeof o[k] === 'object' && o[k] !== null) {
        deepTraverse(o[k]);
      }
    }
  }
}

用于配置文件、树结构、JSON 等。


📌 各方法差异对比表

方法是否遍历原型链是否可枚举是否含 Symbol是否含不可枚举
for…in
Object.keys
Object.values
Object.entries
Object.getOwnPropertyNames✔ + ✖
Object.getOwnPropertySymbols✔ + ✖
Reflect.ownKeys✔ + ✖

👉 结论:
要遍历所有属性,用 Reflect.ownKeys()


🎯 实际项目如何选择?

✔ 最常用(推荐)

Object.keys(obj).forEach(...)

✔ 当你需要键 + 值(推荐)

for (const [k, v] of Object.entries(obj)) {}

✔ 需要遍历 Symbol

Object.getOwnPropertySymbols()

✔ 需要全部属性(最完整)

Reflect.ownKeys()

✔ 老代码兼容

for...in + hasOwnProperty