写点什么

JavaScript 中如何遍历对象?

  • 2025-07-08
    福建
  • 本文字数:1662 字

    阅读完需:约 5 分钟

JavaScript 中如何遍历对象?


今天来点稍微轻松的话题,如何在 JavaScript 中遍历对象,在平常的工作中,遍历对象是很常见的操作,javascript 提供了多种方法来遍历对象的属性。这些方法各有特点,不同的场景需要使用不同的方法。

假设我们有一个Person对象,包含名字和年龄两个属性,下面看看有哪些方式可以遍历这个对象。

const person = {  name: 'Philip',  age: 18,};
复制代码


for...in


遍历对象最基本的方式就是使用for...in,这里需要注意区分和for...of的区别。

  • for...in - 遍历可枚举对象,比如Object

  • for...of - 遍历可迭代对象,比如Array

在以下代码中,key是每个属性的名字 - 对应nameage,而person[key]则是每个属性的值 - 对应Philip18

for (const key in person) {  console.log(key, person[key]);}
复制代码


输出如下:

name Philipage 18
复制代码


for...in是遍历对象最基本的方式,需要注意的是它不仅会遍历对象自身的属性,也会遍历原型链上的属性。假设我们在Object.prototype上添加一个属性,那么这个属性也会被遍历到。

Object.prototype.customProperty = 'Hello World';for (const key in person) {  console.log(key, person[key]);}
复制代码


输出如下:

name Philipage 18customProperty Hello World
复制代码


如果你只想遍历对象自身的属性,可以使用Object.hasOwnProperty方法来过滤掉原型链上的属性。

for (const key in person) {  if (person.hasOwnProperty(key)) {    console.log(key, person[key]);  }}
复制代码


使用for...of + Object.keys


Object.keys方法返回一个对象中所有可枚举属性的键名并放到一个数组里,配合for...of可以很方便地遍历对象的属性。

for (const key of Object.keys(person)) {  console.log(key, person[key]);}
复制代码


使用for...of + Object.values


如果你只关心对象的值,而不在 key 的话,那么可以使用Object.values方法,它返回一个包含对象所有可枚举属性值的数组。

for (const value of Object.values(person)) {  console.log(value);}
复制代码


输出如下:

Philip18
复制代码


for...of + Object.entries


下面的方法使用for...of进行遍历,我们都知道for..of是用来遍历可迭代对象的,所以Object.entries返回的一定是一个可迭代对象 - 这里是一个二维数组,然后[key, value]是一个解构操作,负责解构内层一维数组中的值并输出。

for (const [key, value] of Object.entries(person)) {  console.log(key, value);}
复制代码


Object.entries(person)输出如下,可以看作是一个键值对组成的二维数组。

[[name, 'Philip'], [age, 18]]
复制代码


使用[key, value]进行解构后正好得到两组数据:

key = name, value = 'Philip' // 第一组数据key = age, value = 18 // 第二组数据
复制代码

Object.entries + forEach


一个更加函数式的写法是使用数组对象上的forEach方法。


Object.entries(person).forEach(([key, value]) => {  console.log(key, value);});
复制代码

forEach本质上和for...of并无区别,在使用链式操作时,这种方式可读性更好,比如和filter等方法串联调用时。

Object.entries(person)  .filter(([key, value]) => key !== 'age') // 过滤掉 age 属性  .forEach(([key, value]) => console.log(key));
复制代码


还有一点要注意,那就是forEach是无法中断的,比如不能使用continue或者break来中断循环,但是for...infor...of则不受此限制。


Reflect.ownKeys


如果你的对象中有Symbol类型的属性,那么可以使用Reflect.ownKeys方法来获取所有属性的键名。

const person = {  name: 'Philip',  age: 18,  [Symbol('id')]: 123,};
Reflect.ownKeys(person).forEach(key => { console.log(key, person[key]);});
复制代码


输出如下:

name Philipage 18Symbol(id) 123
复制代码

Reflect.ownKeys是遍历Symbol类型属性的唯一方法。


最后,如果你使用的是TypeScript,那么所有使用了索引操作的遍历方式(比如person[key])都需要添加索引签名,否则TypeScript会报错,具体原因可以看这篇:


好了最后用表格总结一下:



文章转载自:前端风云志

原文链接:https://www.cnblogs.com/graphics/p/18972113

体验地址:http://www.jnpfsoft.com/?from=001YH

用户头像

还未添加个人签名 2025-04-01 加入

还未添加个人简介

评论

发布
暂无评论
JavaScript中如何遍历对象?_JavaScript_电子尖叫食人鱼_InfoQ写作社区