细究 ES6 中多种遍历对象键名方式的区别

一、前言

说到遍历对象,第一反应是用 for...in..、和 Object.keys()。平常最多用的就是这俩个。

最近重新翻看 《ES6 标准入门》这本书,发现遍历对象键名的方式还是挺多的。

今天借此机会,以一个基本案例,总结五种遍历对象键名的使用及其不同点。

基本案例代码

const parentObj = {inheritedProp: 'inherited value',
}// 给父对象添加 Symbol 属性
const inheritedSymbol = Symbol('inheritedSymbol property')
parentObj[inheritedSymbol] = 'inheritedSymbol value'// 创建子对象,继承父对象
const childrenObj = Object.create(parentObj)// 添加自身的可枚举属性
childrenObj.enumerableProp = 'enumerable value';// 添加自身的不可枚举属性
Object.defineProperty(childrenObj, 'nonEnumerableProp', {value: 'non - enumerable value',enumerable: false
});// 添加自身的 Symbol 属性
const symbolProp = Symbol('symbol property');
childrenObj[symbolProp] = 'symbol value';

二、for…in…

使用

for (let key in childrenObj) {console.log(key, ':', childrenObj[key]) 
}

输出结果

 enumerableProp : enumerable valueinheritedProp : inherited value

结论

for..in..:遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)

三、Object.keys()

使用

Object.keys(childrenObj).map(key => {console.log(key, ':', childrenObj[key])
})

输出结果

enumerableProp : enumerable value

结论

Object.keys():遍历对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名

四、Object.getOwnPropertyNames()

使用

Object.getOwnPropertyNames(childrenObj).map(key => {console.log(key, ':', childrenObj[key]) 
})

输出结果

 enumerableProp : enumerable valuenonEnumerableProp : non - enumerable value

结论

Object.getOwnPropertyNames():包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名

五、Object.getOwnPropertySymbols

使用

Object.getOwnPropertySymbols(childrenObj).map(key => {console.log(key, ':', childrenObj[key]) 
})

输出结果

Symbol(symbol property) : symbol value

结论

Object.getOwnPropertySymbols:包含对象自身的所有 Symbol 属性的键名

六、Reflect.ownKeys()

使用

Reflect.ownKeys(childrenObj).map(key => {console.log(key, ':', childrenObj[key])
})

输出结果

 enumerableProp : enumerable valuenonEnumerableProp : non - enumerable valueSymbol(symbol property) : symbol value

结论

Reflect.ownKeys():包含对象自身的(不含继承的)所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举

七、总结

for...in:遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)

Object.keys():遍历对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名

Object.getOwnPropertyNames():包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名

Object.getOwnPropertySymbols():包含对象自身的所有 Symbol 属性的键名

Reflect.ownKeys():包含对象自身的(不含继承的)所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/69703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

尚硅谷爬虫note004

一、urllib库 1. python自带,无需安装 # _*_ coding : utf-8 _*_ # Time : 2025/2/11 09:39 # Author : 20250206-里奥 # File : demo14_urllib # Project : PythonProject10-14#导入urllib.request import urllib.request#使用urllib获取百度首页源码 #1.定义一…

Spring 项目接入 DeepSeek,分享两种超简单的方式!

⭐自荐一个非常不错的开源 Java 面试指南:JavaGuide (Github 收获148k Star)。这是我在大三开始准备秋招面试的时候创建的,目前已经持续维护 6 年多了,累计提交了 5600 commit ,共有 550 多位贡献者共同参与…

批量查询linux下可执行程序缺少的依赖

方法一:使用 find 和 xargs find . -maxdepth 1 -type f -executable | xargs ldd方法二:使用 for 循环 直接复制下面内容粘贴到命令行即可 for file in *; doif [ -f "$file" ] && [ -x "$file" ]; thenecho "Depe…

日常知识点之面试后反思裸写string类

1:实现一个字符串类。 简单汇总 最简单的方案,使用一个字符串指针,以及实际字符串长度即可。 参考stl的实现,为了提升string的性能,实际上单纯的字符串指针和实际长度是不够了,如上,有优化方案…

phpipam1.7安装部署

0软件说明 phpipam是一个开源Web IP地址管理应用程序(IPAM) phpipam官网:https://www.phpipam.net/ 1安装环境 操作系统:Rocky Linux9.5x86_64 phpipam版本:1.7 php版本:8.0.30 数据库版本&#xff1a…

python卷积神经网络人脸识别示例实现详解

目录 一、准备 1)使用pytorch 2)安装pytorch 3)准备训练和测试资源 二、卷积神经网络的基本结构 三、代码实现 1)导入库 2)数据预处理 3)加载数据 4)构建一个卷积神经网络 5&#xff0…

网络安全总结

网络安全总结 网络安全第一篇 1. 防火墙必不可少(局域网与互联网之间必须隔离) 连接到Internet的每一个人都需要在其网络入口处采取一定的措施來阻止和丢弃恶意的网络通信,但是我们貌似没有这么做,这就需要我们在物理或者软件实现我们的防火墙&#xf…

【文本处理】如何在批量WORD和txt文本提取手机号码,固话号码,提取邮箱,删除中文,删除英文,提取车牌号等等一些文本提取固定格式的操作,基于WPF的解决方案

企业的应用场景 数据清洗:在进行数据导入或分析之前,往往需要对大量文本数据进行预处理,比如去除文本中的无关字符(中文、英文),只保留需要的联系信息(手机号码、固话号码、邮箱)。…

【Cocos TypeScript 零基础 15.1】

目录 见缝插针UI脚本针脚本球脚本心得_旋转心得_更改父节点心得_缓动动画成品展示图 见缝插针 本人只是看了老师的大纲,中途不明白不会的时候再去看的视频 所以代码可能与老师代码有出入 SIKI_学院_点击跳转 UI脚本 import { _decorator, Camera, color, Component, directo…

pdf.js默认显示侧边栏和默认手形工具

文章目录 默认显示侧边栏(切换侧栏)默认手形工具(手型工具) 大部分的都是在viewer.mjs中的const defaultOptions 变量设置默认值,可以使用数字也可以使用他们对应的变量枚举值 默认显示侧边栏(切换侧栏) 在viewer.mjs中找到defaultOptions,大概在732行,或则搜索sidebarViewOn…

基于 ollama 在linux 私有化部署DeepSeek-R1以及使用RESTful API的方式使用模型

由于业务需求部署的配置 deepseek:32b,linux配置GPU L20 4卡 ,SSD 200g,暂未发现有什么问题,持续观察中 ##通用写法,忽略就行,与deepseek无关 import pandas as pd from openai.embeddings_utils import get_embedding, cosine_s…

基于 STM32 的病房监控系统

标题:基于 STM32 的病房监控系统 内容:1.摘要 基于 STM32 的病房监控系统摘要:本系统采用 STM32 微控制器作为核心,通过传感器实时监测病房内的环境参数,如温度、湿度、光照等,并将数据上传至云端服务器。医护人员可以通过手机或…

Java分布式幂等性怎么设计?

在高并发的场景的架构中,幂等性是必须得保证的。比如说支付功能,用户发起支付,如果后台没有坐幂等性校验,刚好用户手抖多点了几下,于是后台就有可能多次收到同一个请求,不做幂等性校验很容易就让用户重复支…

Pdf手册阅读(1)--数字签名篇

原文阅读摘要 PDF支持的数字签名, 不仅仅是公私钥签名,还可以是指纹、手写、虹膜等生物识别签名。PDF签名的计算方式,可以基于字节范围进行计算,也可以基于Pdf 对象(pdf object)进行计算。 PDF文件可能包…

Debezium系列之:时区转换器,时间戳字段转换到指定时区

Debezium系列之:时区转换器,时间戳字段转换到指定时区 示例:基本配置应用TimezoneConverter SMT的效果示例:高级配置配置选项当Debezium发出事件记录时,记录中的时间戳字段的时区值可能会有所不同,这取决于数据源的类型和配置。为了在数据处理管道和应用程序中保持数据一…

Zabbix-监控SSL证书有效期

背景 项目需要,需要监控所有的SSL证书的有效期,因此需要自定义一个监控项 实现 创建自定义脚本 在Zabbix的scripts目录(/etc/zabbix/scripts/)下创建一个新的shell脚本check_ssl.sh,内容如下 #!/bin/bash time$(echo | openssl s_client…

【AI知识点】大模型开源的各种级别和 deepseek 的开源级别

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】【AI应用】 大模型开源的各种级别 大模型的“开源”程度不同,通常可以分为以下几个主要级别: 1. 权重不开源(Closed-source) 特点:仅…

java安全中的类加载

java安全中的类加载 提前声明: 本文所涉及的内容仅供参考与教育目的,旨在普及网络安全相关知识。其内容不代表任何机构、组织或个人的权威建议,亦不构成具体的操作指南或法律依据。作者及发布平台对因使用本文信息直接或间接引发的任何风险、损失或法律纠…

探索 API 文档新境界:Swagger 助力生成带权限控制的 API 文档

各位开发者朋友们!在咱们的开发工作里,API 文档就像是项目的说明书,清晰准确的文档能让我们的开发效率大幅提升。而当涉及到权限控制时,如何生成既安全又详细的 API 文档就成了一个关键问题。今天,我就和大家好好唠唠如…

只需三步!5分钟本地部署deep seek——MAC环境

MAC本地部署deep seek 第一步:下载Ollama第二步:下载deepseek-r1模型第三步:安装谷歌浏览器插件 第一步:下载Ollama 打开此网址:https://ollama.com/,点击下载即可,如果网络比较慢可使用文末百度网盘链接 注:Ollama是…