JavaScript对象遍历方法详解

JavaScript对象遍历方法详解

技术背景

在JavaScript编程中,经常需要遍历对象的属性和值。然而,由于对象属性存在自有属性、继承属性、可枚举属性和不可枚举属性等不同类型,以及属性名可以是字符串或Symbol,这使得对象的遍历变得复杂。因此,了解不同的遍历方法及其适用场景非常重要。

实现步骤

1. 使用for-in循环

for-in循环会遍历对象的可枚举属性,包括继承的属性,且属性名必须是字符串。使用时需要通过hasOwnProperty方法确保遍历的是对象自身的属性。

1
2
3
4
5
6
7
8
9
10
11
var p = {
"p1": "value1",
"p2": "value2",
"p3": "value3"
};

for (var key in p) {
if (p.hasOwnProperty(key)) {
console.log(key + " -> " + p[key]);
}
}

2. 使用Object.keys()结合for-of循环

Object.keys()返回一个由对象自身的可枚举属性名组成的数组,使用for-of循环遍历该数组可以获取对象的属性和值。

1
2
3
4
5
6
7
8
9
var p = {
0: "value1",
"b": "value2",
key: "value3"
};

for (var key of Object.keys(p)) {
console.log(key + " -> " + p[key])
}

3. 使用Object.entries()方法

Object.entries()返回一个由对象自身的可枚举属性的键值对组成的数组,使用for-of循环可以直接获取属性名和属性值。

1
2
3
4
5
6
7
8
9
const p = {
"p1": "value1",
"p2": "value2",
"p3": "value3"
};

for (const [key, value] of Object.entries(p)) {
console.log(`${key}: ${value}`);
}

4. 使用第三方库方法

  • jQuery:使用$.each()方法可以无缝遍历对象和数组。
1
2
3
4
var obj = { first: "John", last: "Doe" };
$.each(obj, function(key, value) {
console.log(key, value);
});
  • Underscore.js:使用_.each()方法遍历对象。
1
2
3
_.each(obj, function(value, key) {
console.log(key, value);
});
  • Lo-Dash:使用_.forIn()_.forOwn()方法遍历对象属性。
1
2
3
_.forIn(obj, function(value, key) {
console.log(key, value);
});

核心代码

以下是几种常见遍历方法的核心代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// for-in循环
var p = {
"p1": "value1",
"p2": "value2",
"p3": "value3"
};
for (var key in p) {
if (p.hasOwnProperty(key)) {
console.log(key + " - " + p[key]);
}
}

// Object.keys()结合for-of循环
var p = {
0: "value1",
"b": "value2",
key: "value3"
};
for (var key of Object.keys(p)) {
console.log(key + " - " + p[key]);
}

// Object.entries()方法
const p = {
"p1": "value1",
"p2": "value2",
"p3": "value3"
};
for (const [key, value] of Object.entries(p)) {
console.log(`${key}: ${value}`);
}

最佳实践

  • 考虑兼容性:如果需要支持旧版本浏览器,要注意某些方法(如Object.entries())可能需要使用Polyfill。
  • 性能优化:对于性能敏感的场景,可进行性能测试,选择性能最优的遍历方法。一般来说,基于for-in的解决方案在大多数浏览器中对于大小对象都比较快,基于显式索引i的解决方案在处理小对象时性能较好。
  • 代码可读性:优先选择简洁、易读的代码,如使用Object.entries()结合for-of循环,能更清晰地获取对象的键值对。

常见问题

1. for-in循环遍历到继承属性

for-in循环会遍历对象的可枚举属性,包括继承的属性。为了避免这种情况,需要使用hasOwnProperty方法进行过滤。

1
2
3
4
5
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
// 处理自有属性
}
}

2. 某些方法不支持旧版本浏览器

Object.entries()等ES6及以上的方法,在旧版本浏览器中可能不被支持。可以使用Polyfill来解决兼容性问题,或者使用其他替代方法。

3. 性能问题

不同的遍历方法在不同的浏览器和对象大小下性能表现不同。在性能敏感的场景下,建议进行性能测试,选择最适合的方法。


JavaScript对象遍历方法详解
https://119291.xyz/posts/2025-05-09.javascript-object-iteration-methods/
作者
ww
发布于
2025年5月9日
许可协议