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父窗口控制只弹出一个子窗口
Apr 10 Javascript
jQuery在IE下使用未闭合的xml代码创建元素时的Bug介绍
Jan 10 Javascript
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
Jan 15 Javascript
javascript实现简单的Map示例介绍
Dec 23 Javascript
js使用循环清空某个div中的input标签值
Sep 29 Javascript
详细谈谈AngularJS的子级作用域问题
Sep 05 Javascript
AngularJS封装指令方法详解
Dec 12 Javascript
微信小程序 实现动态显示和隐藏某个控件
Apr 27 Javascript
jQuery遮罩层实例讲解
May 11 jQuery
基于ES6作用域和解构赋值详解
Nov 03 Javascript
Vue事件处理原理及过程详解
Mar 11 Javascript
浅谈vue项目,访问路径#号的问题
Aug 14 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实现邮件群发的源码
2013/06/18 PHP
PHP中的插件机制原理和实例
2014/07/08 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
2015/12/16 PHP
javascript parseInt 大改造
2009/09/27 Javascript
JavaScript判断窗口是否最小化的代码(跨浏览器)
2010/08/01 Javascript
深入理解JSON数据源格式
2014/01/10 Javascript
防止按钮在短时间内被多次点击的方法
2014/03/10 Javascript
Javascript基础教程之JavaScript语法
2015/01/18 Javascript
javascript实现俄罗斯方块游戏的思路和方法
2015/04/27 Javascript
谈一谈JS消息机制和事件机制的理解
2016/04/14 Javascript
javascript实现根据汉字获取简拼
2016/09/25 Javascript
Angular ng-repeat指令实例以及扩展部分
2016/12/26 Javascript
jQuery查找dom的几种方法效率详解
2017/05/17 jQuery
Vue-router结合transition实现app前进后退动画切换效果的实例
2017/10/11 Javascript
vue2中引用及使用 better-scroll的方法详解
2018/11/15 Javascript
详解js获取video任意时间的画面截图
2019/04/17 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
利用Angular7开发一个Radio组件的全过程
2019/07/11 Javascript
JS回调函数深入理解
2019/10/16 Javascript
Nest.js 授权验证的方法示例
2021/02/22 Javascript
python中尾递归用法实例详解
2015/04/28 Python
Python中列表和元组的相关语句和方法讲解
2015/08/20 Python
Python PyQt4实现QQ抽屉效果
2018/04/20 Python
20行Python代码实现视频字符化功能
2020/04/13 Python
Jupyter 无法下载文件夹如何实现曲线救国
2020/04/22 Python
简单了解Java Netty Reactor三种线程模型
2020/04/26 Python
pyx文件 生成pyd 文件用于 cython调用的实现
2021/03/04 Python
html table呈现个人简历以及单元格宽度失效的问题解决
2021/01/22 HTML / CSS
阿联酋航空丹麦官方网站:Emirates DK
2019/08/25 全球购物
2014年三八妇女节活动方案
2014/02/28 职场文书
鲁迅故居导游词
2015/02/05 职场文书
岗位聘任报告
2015/03/02 职场文书
“5.12”护士节主持词
2015/07/04 职场文书
中秋联欢会主持词
2015/07/04 职场文书
军训结束新闻稿
2015/07/17 职场文书
Vue h函数的使用详解
2022/02/18 Vue.js