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

一、前言

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

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

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

基本案例代码

js 复制代码
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...

使用

js 复制代码
for (let key in childrenObj) {
  console.log(key, ':', childrenObj[key]) 
}

输出结果

复制代码
 enumerableProp : enumerable value
 inheritedProp : inherited value

结论

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

三、Object.keys()

使用

js 复制代码
Object.keys(childrenObj).map(key => {
  console.log(key, ':', childrenObj[key])
})

输出结果

复制代码
enumerableProp : enumerable value

结论

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

四、Object.getOwnPropertyNames()

使用

js 复制代码
Object.getOwnPropertyNames(childrenObj).map(key => {
  console.log(key, ':', childrenObj[key]) 
})

输出结果

复制代码
 enumerableProp : enumerable value
 nonEnumerableProp : non - enumerable value

结论

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

五、Object.getOwnPropertySymbols

使用

js 复制代码
Object.getOwnPropertySymbols(childrenObj).map(key => {
  console.log(key, ':', childrenObj[key]) 
})

输出结果

复制代码
Symbol(symbol property) : symbol value

结论

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

六、Reflect.ownKeys()

使用

js 复制代码
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 或字符串,也不管是否可枚举

相关推荐
天平1 小时前
油猴脚本创建webworker踩坑记录
前端·javascript·typescript
原则猫3 小时前
前端基础大厦
前端
陈随易4 小时前
编程语言级别的Skill市场,AI Agent 的未来形态
前端·后端·程序员
SoaringHeart5 小时前
Flutter进阶:基于 EasyRefresh 的下拉刷新封装 n_easy_refresh_mixin.dart
前端·flutter
IT_陈寒6 小时前
Vite的热更新突然不香了,排查三小时差点砸键盘
前端·人工智能·后端
子兮曰7 小时前
Agency-Agents 深度解析:400+ AI 专家的"梦之队"如何重塑开发工作流
前端·后端·vibecoding
山河木马7 小时前
渲染管线-计算得到gl_Position(顶点着色器)之后续GPU流程
javascript·webgl·图形学
竹林8188 小时前
用 The Graph 查询链上数据实战:从手搓 RPC 到 Subgraph,我的 NFT 项目数据加载快了 10 倍
前端·javascript
妙码生花8 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十九):点选验证码代码逐行目检
前端·后端·go
Awu12279 小时前
⚡从零开发 Agent CLI(五)实现一个可治理、可扩展的工具系统
前端·人工智能·claude