在 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() 以满足大部分场景。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐