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 Philip
age 18

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

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

输出如下:

name Philip
age 18
customProperty 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);
}

输出如下:

Philip
18

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 Philip
age 18
Symbol(id) 123

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

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

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

方法 包含继承属性 包含Symbol 包含不可枚举属性 TypeScript支持
for...in 需要索引签名
Object.keys()
Object.values()
Object.entries()
Reflect.ownKeys()

今天就到这里了,今天是我生日,感谢大家的支持,我们明天见!

JavaScript中如何遍历对象?的更多相关文章

  1. JavaScript中的事件对象

    JavaScript中的事件对象 JavaScript中的事件对象是非常重要的,恐怕是我们在项目中使用的最多的了.在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含这所有与事件有 ...

  2. JavaScript中创建字典对象(dictionary)实例

    这篇文章主要介绍了JavaScript中创建字典对象(dictionary)实例,本文直接给出了实现的源码,并给出了使用示例,需要的朋友可以参考下 对于JavaScript来说,其自身的Array对象 ...

  3. Javascript学习1 - Javascript中的类型对象

    原文:Javascript学习1 - Javascript中的类型对象 1.1关于Numbers对象. 常用的方法:number.toString() 不用具体介绍,把数字转换为字符串,相应的还有一个 ...

  4. 简单使用JSON,JavaScript中创建 JSON 对象(一)

    JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小.更快,更易解析. ...

  5. JavaScript中的window对象

    JavaScript中的window对象:http://www.cnblogs.com/kissdodog/archive/2013/01/01/2841464.html

  6. js:JavaScript中的ActiveXObject对象

    JavaScript中的ActiveXObject对象作用: https://blog.csdn.net/pl1612127/article/details/77862174

  7. 详解javascript中的this对象

    详解javascript中的this对象 前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.Javascript可以通过一定的 ...

  8. javascript中如何获取对象名

    javascript中如何获取对象名 一.总结 一句话总结:将对象传入参数,看参数是否为函数(js中的对象和函数是一个意思么(函数肯定是对象)),对象参数.name属性即可获得 //版本4 funct ...

  9. JavaScript中的global对象,window对象以及document对象的区别和联系

    JavaScript中的global对象,window对象以及document对象的区别和联系 一.概念区分:JavaScript中的global对象,window对象以及document对象 1.g ...

  10. 【JavaScript】JavaScript中的ActiveXObject对象

    JavaScript中ActiveXObject对象是启用并返回 Automation 对象的引用.    使用方法: newObj = new ActiveXObject( servername.t ...

随机推荐

  1. 新装ubuntu电脑的一些调整

    必要命令的安装 必要开发工具的安装 更换国内软件源 /etc/apt/sources.list文件,后面添加下面地址用来添加阿里源 deb http://mirrors.aliyun.com/ubun ...

  2. lua三色标记的读写屏障理解

    起因是已经被标记为黑色的对象无法进行再次遍历,然而黑色对象发生了引用变化:断开了引用或者引用了别的对象,会导致多标(不再被黑色对象引用的对象未能回收),漏标(黑色对象的新引用未能遍历标记)

  3. MySQL建立RFM模型

    1.数据来源 charge_record表数据 提取代码如下: # coding=utf-8import pymysql# 原数据库链接db1 = pymysql.connect( host='*** ...

  4. JDK的SPI有什么缺陷?dubbo做了什么改进?

    JDK的SPI机制的缺点 ⽂件中的所有类都会被加载且被实例化.这样也就导致获取某个实现类的方式不够灵活,只能通过 Iterator 形式获取,不能根据某个参数来获取对应的实现类.如果不想用某些实现类, ...

  5. 银河麒麟系统 jenkins docker 部署 自动化打包部署git 项目

    Jenkins 是一个开源的自动化服务器,主要用于实现 持续集成(CI) 和 持续交付/部署(CD),其核心作用在于通过自动化流程提升软件开发和交付的效率与质量 一.环境准备 1. 安装 Docker ...

  6. Spring Boot Jpa封装快速构建Specification、OrderBy、Pageable的查询条件

    ​ 1.简介 在我们使用JPA时,构建 Specification 查询条件时重复代码过多,而且需要大量的无效代码. 2.工具类提供的方法 2.1.自动构建规范 /** * 自动构建规范 * * @p ...

  7. RocketMQ半消息对消费者不可见是如何实现的?——事务消息机制揭秘

    首发于工号[BiggerBoy],原文链接 --"半消息藏在这里,但为什么你偷看也没用?" 上篇<RocketMQ系列笔记(三):消息模型与高阶玩法,顺序事务消息拿捏指南&g ...

  8. 模板导入_分页_cookie_装饰器_笔记

    默认值:url(r'index/', views.index,{'name':"root"})def index(request,name):    print(name)     ...

  9. DeepSeek+Coze实战:从0到1搭建小红书图文改写智能体(喂饭级教程)

    大家好,我是汤师爷,专注AI智能体分享~ 还在为小红书笔记创作发愁吗? 每天都要绞尽脑汁想文案,看着别人的爆款笔记却不知道如何模仿? 今天,我就教你如何利用AI智能体,轻松实现小红书图文改写,让创作效 ...

  10. 补充停牌的日K数据

    问题 从TuShare获取的数据,停牌日是没有数据的,这将会在回测时,不能直接参与账户的净值计算,导致账户的净值以及收益计算不准确. 停盘 股票由于某种消息或进行某种活动引起股价的连续上涨或下跌,由证 ...