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高级程序设计(第3版)学习笔记2 js基础语法
Oct 11 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
Nov 08 Javascript
鼠标滑过出现预览的大图提示效果
Feb 26 Javascript
jQuery寻找n以内完全数的方法
Jun 24 Javascript
基于jquery实现省市联动效果
Nov 23 Javascript
三种AngularJS中获取数据源的方式
Feb 02 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
Jul 15 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
Apr 13 Javascript
Bootstrap Table使用整理(三)
Jun 09 Javascript
React中使用collections时key的重要性详解
Aug 07 Javascript
vue实现登录后页面跳转到之前页面
Jan 07 Javascript
JS中的JSON对象的定义和取值实现代码
May 09 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 应用程序安全防范技术研究
2009/09/25 PHP
Mysql数据库操作类( 1127版,提供源码下载 )
2010/12/02 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
2013/06/14 PHP
php基于PDO连接MSSQL示例DEMO
2016/07/13 PHP
PHP实现的随机红包算法示例
2017/08/14 PHP
Highslide.js是一款基于js实现的网页中图片展示插件
2020/03/30 Javascript
js模拟点击事件实现代码
2012/11/06 Javascript
用js实现小球的自由移动代码
2013/04/22 Javascript
深入理解JavaScript系列(50):Function模式(下篇)
2015/03/04 Javascript
js+html5实现canvas绘制简单矩形的方法
2015/06/05 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
2015/08/25 Javascript
详解jQuery中的empty、remove和detach
2016/04/11 Javascript
20分钟轻松创建自己的Bootstrap站点
2016/05/12 Javascript
Vue.JS入门教程之处理表单
2016/12/01 Javascript
js数组去重的hash方法
2016/12/22 Javascript
jQuery插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
2017/03/23 jQuery
Angular开发实践之服务端渲染
2018/03/29 Javascript
layui中table表头样式修改方法
2018/08/15 Javascript
详解如何给React-Router添加路由页面切换时的过渡动画
2019/04/25 Javascript
深入理解Vue keep-alive及实践总结
2019/08/21 Javascript
layui 上传文件_批量导入数据UI的方法
2019/09/23 Javascript
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
2013/01/17 Python
整理Python 常用string函数(收藏)
2016/05/30 Python
Python 多线程Threading初学教程
2017/08/22 Python
Python实现基于POS算法的区块链
2018/08/07 Python
浅谈Python中的模块
2020/06/10 Python
celery在python爬虫中定时操作实例讲解
2020/11/27 Python
Html5 页面适配iPhoneX(就是那么简单)
2019/09/05 HTML / CSS
Banana Republic英国官网:香蕉共和国,GAP集团旗下偏贵族风
2018/04/24 全球购物
CK澳大利亚官网:Calvin Klein澳大利亚
2020/12/12 全球购物
阿甘正传观后感
2015/06/01 职场文书
《自己的花是让别人看的》教学反思
2016/02/19 职场文书
2019自荐信范文集锦!
2019/07/03 职场文书
JavaScript实现简单拖拽效果
2021/09/15 Javascript
golang生成vcf通讯录格式文件详情
2022/03/25 Golang