JS 5种遍历对象的方式


Posted in Javascript onJune 16, 2020

几天前一个小伙伴问我 Object.getOwnPropertyNames() 是干什么用的

平时还真没有使用到这个方法,一时不知如何回答

从方法名称来分析,应该是返回的是对象自身属性名组成的数组

那和 Object.keys() 方法不就一样了吗

感觉事情并不这么简单,于是我仔细看了一下这几种遍历对象的方法的区别

for in

for in 循环是最基础的遍历对象的方式,它还会得到对象原型链上的属性

// 创建一个对象并指定其原型,bar 为原型上的属性
const obj = Object.create({
 bar: 'bar'
})

// foo 为对象自身的属性
obj.foo = 'foo'

for (let key in obj) {
 console.log(obj[key]) // foo, bar
}

可以看到对象原型上的属性也被循环出来了

在这种情况下可以使用对象的 hasOwnProperty() 方法过滤掉原型链上的属性

for (let key in obj) {
 if (obj.hasOwnProperty(key)) {
  console.log(obj[key]) // foo
 }
}

这时候原型上的 bar 属性就被过滤掉了

Object.keys

Object.keys() 是 ES5 新增的一个对象方法,该方法返回对象自身属性名组成的数组,它会自动过滤掉原型链上的属性,然后可以通过数组的 forEach() 方法来遍历

Object.keys(obj).forEach((key) => {
 console.log(obj[key]) // foo
})

另外还有 Object.values() 方法和 Object.entries() 方法,这两方法的作用范围和 Object.keys() 方法类似,因此不再说明

for in 循环和 Object.keys() 方法都不会返回对象的不可枚举属性

如果需要遍历不可枚举的属性,就要用到前面提到的 Object.getOwnPropertyNames() 方法了

Object.getOwnPropertyNames

Object.getOwnPropertyNames() 也是 ES5 新增的一个对象方法,该方法返回对象自身属性名组成的数组,包括不可枚举的属性,也可以通过数组的 forEach 方法来遍历

// 创建一个对象并指定其原型,bar 为原型上的属性
// baz 为对象自身的属性并且不可枚举
const obj = Object.create({
 bar: 'bar'
}, {
 baz: {
  value: 'baz',
  enumerable: false
 }
})

obj.foo = 'foo'

// 不包括不可枚举的 baz 属性
Object.keys(obj).forEach((key) => {
 console.log(obj[key]) // foo
})

// 包括不可枚举的 baz 属性
Object.getOwnPropertyNames(obj).forEach((key) => {
 console.log(obj[key]) // baz, foo
})

ES2015 新增了 Symbol 数据类型,该类型可以作为对象的键,针对该类型 ES2015 同样新增Object.getOwnPropertySymbols() 方法

Object.getOwnPropertySymbols

Object.getOwnPropertySymbols() 方法返回对象自身的 Symbol 属性组成的数组,不包括字符串属性

Object.getOwnPropertySymbols(obj).forEach((key) => {
 console.log(obj[key])
})

什么都没有,因为该对象还没有 Symbol 属性

// 给对象添加一个不可枚举的 Symbol 属性
Object.defineProperties(obj, {
 [Symbol('baz')]: {
  value: 'Symbol baz',
  enumerable: false
 }
})

// 给对象添加一个可枚举的 Symbol 属性
obj[Symbol('foo')] = 'Symbol foo'

Object.getOwnPropertySymbols(obj).forEach((key) => {
 console.log(obj[key]) // Symbol baz, Symbol foo
})

Reflect.ownKeys

Reflect.ownKeys() 方法是 ES2015 新增的静态方法,该方法返回对象自身所有属性名组成的数组,包括不可枚举的属性和 Symbol 属性

Reflect.ownKeys(obj).forEach((key) => {
 console.log(obj[key]) // baz, foo, Symbol baz, Symbol foo
})

对比

方式 基本属性 原型链 不可枚举 Symbol
for in
Object.keys()
Object.getOwnPropertyNames()
Object.getOwnPropertySymbols()
Reflect.ownKeys()

结论

这其中只有 for in 循环会得到对象原型链上的属性,其它方法都只适用于对象自身的属性

ES 语言后续添加的新特性不会对以前的代码产生副作用,比如在 ES2015 之前就存在的 for in 循环,Object.keys() 和 Object.getOwnPropertyNames() 是肯定不会返回 Symbol 属性的

以上就是JS 5种遍历对象的方式的详细内容,更多关于JS 遍历对象的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
Javascript的IE和Firefox兼容性汇编
Jul 01 Javascript
Extjs ajax同步请求时post方式参数发送方式
Aug 05 Javascript
用 Javascript 验证表单(form)中的单选(radio)值
Sep 08 Javascript
JS实现简单的Canvas画图实例
Jul 04 Javascript
JavaScript中document.forms[0]与getElementByName区别
Jan 21 Javascript
在线所见即所得HTML编辑器的实现原理浅析
Apr 25 Javascript
微信小程序 数据访问实例详解
Oct 08 Javascript
jQuery Validate表单验证插件的基本使用方法及功能拓展
Jan 04 Javascript
JavaScript实现一个空中避难的小游戏
Jun 06 Javascript
js 开发之autocomplete="off"在chrom中失效的解决办法
Sep 28 Javascript
vue中引用阿里字体图标的方法
Feb 10 Javascript
原生js实现商品筛选功能
Oct 28 Javascript
js实现小球在页面规定的区域运动
Jun 16 #Javascript
Vue结合路由配置递归实现菜单栏功能
Jun 16 #Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
Jun 16 #Javascript
详解JS预解析原理
Jun 16 #Javascript
深入了解JS之作用域和闭包
Jun 16 #Javascript
JS数组及对象遍历方法代码汇总
Jun 16 #Javascript
浅谈Vue 函数式组件的使用技巧
Jun 16 #Javascript
You might like
php include,include_once,require,require_once
2008/09/05 PHP
php 取得瑞年与平年的天数的代码
2009/08/10 PHP
php explode函数实例代码
2012/02/27 PHP
PHP获取一个字符串中间一部分字符的方法
2014/08/19 PHP
PHP中使用curl伪造IP的简单方法
2015/08/07 PHP
PHP获取远程http或ftp文件的md5值的方法
2019/04/15 PHP
浅析JavaScript中的delete运算符
2013/11/30 Javascript
使用GruntJS构建Web程序之安装篇
2014/06/04 Javascript
js通过location.search来获取页面传来的参数
2014/09/11 Javascript
js获取内联样式的方法
2015/01/27 Javascript
jquery任意位置浮动固定层插件用法实例
2015/05/29 Javascript
AngularJS中的$watch(),$digest()和$apply()区分
2016/04/04 Javascript
JavaScript中获取HTML元素值的三种方法
2016/06/20 Javascript
Bootstrap弹出带合法性检查的登录框实例代码【推荐】
2016/06/23 Javascript
微信小程序  wx.request合法域名配置详解
2016/11/23 Javascript
React学习笔记之列表渲染示例详解
2017/08/22 Javascript
如何理解Vue的render函数的具体用法
2017/08/30 Javascript
十个免费的web前端开发工具详细整理
2017/09/18 Javascript
jQuery实现的鼠标滚轮控制图片缩放功能实例
2017/10/14 jQuery
JS实现获取进今年第几天是周几的方法分析
2018/06/27 Javascript
js中自定义react数据验证组件实例详解
2018/10/19 Javascript
vue项目中使用vue-i18n报错的解决方法
2019/01/13 Javascript
javascript中call()、apply()的区别
2019/03/21 Javascript
Flask SQLAlchemy一对一,一对多的使用方法实践
2013/02/10 Python
python简单实现刷新智联简历
2016/03/30 Python
使用Python通过win32 COM实现Word文档的写入与保存方法
2018/05/08 Python
Python中的异常处理try/except/finally/raise用法分析
2019/02/28 Python
Python搭建代理IP池实现检测IP的方法
2019/10/27 Python
Python根据指定文件生成XML的方法
2020/06/29 Python
详解基于python的图像Gabor变换及特征提取
2020/10/26 Python
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
仓库主管的岗位职责
2013/12/04 职场文书
签约仪式主持词
2014/03/19 职场文书
入职担保书范文
2014/05/21 职场文书
医院见习总结
2015/06/24 职场文书
vue的项目如何打包上线
2022/04/13 Vue.js