JavaScript 遍历对象(Object)的属性和值
·
在 JavaScript 中,遍历对象(Object)的属性和值有多种方法,以下是常见的几种方式及其使用场景:
1. for...in 循环
遍历对象自身及原型链上的可枚举属性(通常只需自身属性时需配合 hasOwnProperty 检查):
const obj = { a: 1, b: 2, c: 3 };
for (const key in obj) {
if (obj.hasOwnProperty(key)) { // 过滤掉原型链上的属性
console.log(`Key: ${key}, Value: ${obj[key]}`);
}
}
2. Object.keys() + forEach
获取对象自身的可枚举属性名数组,然后遍历:
const obj = { a: 1, b: 2, c: 3 };
Object.keys(obj).forEach(key => {
console.log(`Key: ${key}, Value: ${obj[key]}`);
});
3. Object.values()
直接遍历对象的属性值数组(ES2017+):
const obj = { a: 1, b: 2, c: 3 };
Object.values(obj).forEach(value => {
console.log(`Value: ${value}`);
});
4. Object.entries()
获取对象的键值对数组(ES2017+),适合同时需要键和值的场景:
const obj = { a: 1, b: 2, c: 3 };
Object.entries(obj).forEach(([key, value]) => {
console.log(`Key: ${key}, Value: ${value}`);
});
5. Object.getOwnPropertyNames()
获取对象所有自身属性名(包括不可枚举属性,但不包括 Symbol 属性):
const obj = { a: 1, b: 2 };
Object.defineProperty(obj, 'hidden', { value: 3, enumerable: false });
Object.getOwnPropertyNames(obj).forEach(key => {
console.log(`Key: ${key}, Value: ${obj[key]}`);
});
// 输出: a, b, hidden
6. Reflect.ownKeys()
获取对象所有自身键名(包括 Symbol 属性和不可枚举属性,ES6+):
const obj = { a: 1, [Symbol('id')]: 2 };
Object.defineProperty(obj, 'hidden', { value: 3, enumerable: false });
Reflect.ownKeys(obj).forEach(key => {
console.log(`Key: ${key}, Value: ${obj[key]}`);
});
// 输出: a, hidden, Symbol(id)
7. 特殊情况:Symbol 属性
若对象包含 Symbol 属性,需使用 Object.getOwnPropertySymbols():
const obj = { a: 1, [Symbol('id')]: 2 };
Object.getOwnPropertySymbols(obj).forEach(sym => {
console.log(`Symbol Key: ${sym.toString()}, Value: ${obj[sym]}`);
});
总结对比
| 方法 | 遍历目标 | 是否包含原型链属性 | 是否包含不可枚举属性 | 是否包含 Symbol 属性 |
|---|---|---|---|---|
for...in | 可枚举属性名 | ✅ | ❌ | ❌ |
Object.keys() | 自身可枚举属性名 | ❌ | ❌ | ❌ |
Object.values() | 自身可枚举属性值 | ❌ | ❌ | ❌ |
Object.entries() | 自身可枚举键值对 | ❌ | ❌ | ❌ |
Object.getOwnPropertyNames() | 所有自身属性名(不含 Symbol) | ❌ | ✅ | ❌ |
Reflect.ownKeys() | 所有自身键名(包括 Symbol) | ❌ | ✅ | ✅ |
根据需求选择合适的方法,通常推荐 Object.entries() 或 Object.keys() 以满足大部分场景。
更多推荐


所有评论(0)