菜鸟-创作你的创作

JavaScript中如何遍历对象(方法汇总)

下面整理一份 《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]);
}

✔ 特点

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]);
});

✔ 特点


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

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

✔ 特点


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

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

✔ 特点


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

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

✔ 特点

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


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

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

✔ 特点


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

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

✔ 特点

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


⭐ 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

退出移动版