JavaScript 中如何遍历对象?
JavaScript 中如何遍历对象?
今天来点稍微轻松的话题,如何在 JavaScript 中遍历对象,在平常的工作中,遍历对象是很常见的操作,javascript 提供了多种方法来遍历对象的属性。这些方法各有特点,不同的场景需要使用不同的方法。
假设我们有一个Person
对象,包含名字和年龄两个属性,下面看看有哪些方式可以遍历这个对象。
for...in
遍历对象最基本的方式就是使用for...in
,这里需要注意区分和for...of
的区别。
for...in
- 遍历可枚举对象,比如Object
。for...of
- 遍历可迭代对象,比如Array
。
在以下代码中,key
是每个属性的名字 - 对应name
和age
,而person[key]
则是每个属性的值 - 对应Philip
和18
。
输出如下:
for...in
是遍历对象最基本的方式,需要注意的是它不仅会遍历对象自身的属性,也会遍历原型链上的属性。假设我们在Object.prototype
上添加一个属性,那么这个属性也会被遍历到。
输出如下:
如果你只想遍历对象自身的属性,可以使用Object.hasOwnProperty
方法来过滤掉原型链上的属性。
使用for...of
+ Object.keys
Object.keys
方法返回一个对象中所有可枚举属性的键名并放到一个数组里,配合for...of
可以很方便地遍历对象的属性。
使用for...of
+ Object.values
如果你只关心对象的值,而不在 key 的话,那么可以使用Object.values
方法,它返回一个包含对象所有可枚举属性值的数组。
输出如下:
for...of
+ Object.entries
下面的方法使用for...of
进行遍历,我们都知道for..of
是用来遍历可迭代对象的,所以Object.entries
返回的一定是一个可迭代对象 - 这里是一个二维数组,然后[key, value]
是一个解构操作,负责解构内层一维数组中的值并输出。
Object.entries(person)
输出如下,可以看作是一个键值对组成的二维数组。
使用[key, value]
进行解构后正好得到两组数据:
Object.entries
+ forEach
一个更加函数式的写法是使用数组对象上的forEach
方法。
forEach
本质上和for...of
并无区别,在使用链式操作时,这种方式可读性更好,比如和filter
等方法串联调用时。
还有一点要注意,那就是forEach
是无法中断的,比如不能使用continue
或者break
来中断循环,但是for...in
和for...of
则不受此限制。
Reflect.ownKeys
如果你的对象中有Symbol
类型的属性,那么可以使用Reflect.ownKeys
方法来获取所有属性的键名。
输出如下:
Reflect.ownKeys
是遍历Symbol
类型属性的唯一方法。
最后,如果你使用的是TypeScript
,那么所有使用了索引操作的遍历方式(比如person[key]
)都需要添加索引签名,否则TypeScript
会报错,具体原因可以看这篇:
好了最后用表格总结一下:

文章转载自:前端风云志
评论