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 相关文章推荐
jquery简单瀑布流实现原理及ie8下测试代码
Jan 23 Javascript
JavaScript获取表单enctype属性的方法
Apr 02 Javascript
浅谈javascript中的call、apply、bind
Mar 06 Javascript
微信小程序 Audio API详解及实例代码
Sep 30 Javascript
原生JS实现的放大镜效果实例代码
Oct 15 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
Dec 14 Javascript
js仿iphone秒表功能 计算平均数
Jan 11 Javascript
使用vue.js写一个tab选项卡效果
Mar 25 Javascript
本地搭建微信小程序服务器的实现方法
Oct 27 Javascript
原生JavaScript实现todolist功能
Mar 02 Javascript
vue中使用protobuf的过程记录
Oct 26 Javascript
浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑
Sep 12 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
FCKeditor添加自定义按钮
2008/03/27 PHP
保存到桌面、设为桌面且带图标的PHP代码
2013/11/19 PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
2014/03/12 PHP
PHP上传文件时自动分配路径的方法
2015/01/09 PHP
PHP实现的蚂蚁爬杆路径算法代码
2015/12/03 PHP
详谈phpAdmin修改密码后拒绝访问的问题
2017/04/03 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
ExtJS 入门
2010/10/29 Javascript
Javascript开发之三数组对象实例介绍
2012/11/12 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
2013/03/18 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
2014/10/16 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
jquery插件NProgress.js制作网页加载进度条
2015/06/05 Javascript
判断js的Array和Object的实现方法
2016/08/29 Javascript
bootstrap confirmation按钮提示组件使用详解
2017/08/22 Javascript
vue实现计算器功能
2020/02/22 Javascript
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
简单介绍Python中的JSON模块
2015/04/08 Python
详解Python爬虫的基本写法
2016/01/08 Python
python2.7的编码问题与解决方法
2016/10/04 Python
六行python代码的爱心曲线详解
2019/05/17 Python
python自动保存百度盘资源到百度盘中的实例代码
2019/08/26 Python
python自动化发送邮件实例讲解
2021/01/04 Python
波兰珠宝品牌:YES
2019/08/09 全球购物
计算机系毕业生推荐信
2013/11/06 职场文书
三好学生演讲稿范文
2014/04/26 职场文书
诚信贷款承诺书
2014/05/30 职场文书
星级党支部申报材料
2014/05/31 职场文书
超市食品安全承诺书
2015/04/29 职场文书
介绍信范文大全
2015/05/07 职场文书
复兴之路观后感3000字
2015/06/02 职场文书
小学生教师节广播稿
2015/08/19 职场文书
Python3 如何开启自带http服务
2021/05/18 Python
解决WINDOWS电脑开机后桌面没有任何图标
2022/04/09 数码科技
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android