下面整理一份 《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
发表回复