当前位置: 首页 > article >正文

细究 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 value
 inheritedProp : 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 value
 nonEnumerableProp : 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 value
 nonEnumerableProp : non - enumerable value
 Symbol(symbol property) : symbol value

结论

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

七、总结

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

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

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

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

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


http://www.kler.cn/a/543536.html

相关文章:

  • Vue 过渡动画实现全解析:打造丝滑交互体验
  • 七、I2C通信读取LM75B温度
  • 智慧出行与车路云一体化政策研究报告
  • 题解 洛谷 Luogu P1828 [USACO3.2] 香甜的黄油 Sweet Butter 最短路 堆优化Dijkstra Floyd C++
  • [转]Java面试近一个月的面试总结
  • 本地部署DeepSeek R1 + 界面可视化open-webui
  • 基于Spring Boot和MyBatis的后端主键分页查询接口示例
  • DeepSeek-R1-技术文档
  • 基于 MATLAB 的粒子滤波算法实现示例,用于处理手机传感器数据并估计电梯运行参数。
  • github - 使用
  • Android和DLT日志系统
  • 云原生时代的开发利器
  • Spring Boot过滤器链:从入门到精通
  • AWTK fscript 中的 TCP/UDP 客户端扩展函数
  • 使用Python爬虫获取淘宝item_search_tmall API接口数据
  • 压缩stl文件大小
  • Go语言开发桌面应用基础框架(wails v3)-开箱即用框架
  • 【系统架构设计师】嵌入式系统之JTAG接口
  • VSCode选择编译工具(CMake)
  • visual studio 在kylin v10上跨平台编译时c++标准库提示缺少无法打开的问题解决
  • pyside6 的QThread多个案例
  • vue开发06:前端通过webpack配置处理跨域问题
  • 大模型知识蒸馏:技术突破与应用范式重构——从DeepSeek创新看AI基础设施演进路径
  • PHP:从入门到进阶的全面指南
  • Day88:加载游戏图片
  • 2. grafana插件安装并接入zabbix