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 相关文章推荐
Hutia 的 JS 代码集
Oct 24 Javascript
js中top/parent/frame概述及案例应用
Feb 06 Javascript
Ext JS添加子组件的误区探讨
Jun 28 Javascript
浅谈javascript的Touch事件
Sep 27 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
Jun 17 Javascript
Javascript函数中的arguments.callee用法实例分析
Sep 16 Javascript
详解webpack 多入口配置
Jun 16 Javascript
深入理解vue.js中的v-if和v-show
Jun 22 Javascript
Vue.js 实现微信公众号菜单编辑器功能(二)
May 08 Javascript
详解jQuery获取特殊属性的值以及设置内容
Nov 14 jQuery
Vue的H5页面唤起支付宝支付功能
Apr 18 Javascript
微信小程序HTTP接口请求封装代码实例
Sep 05 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
dedecms系统常用术语汇总
2007/04/03 PHP
PHP下判断网址是否有效的代码
2011/10/08 PHP
php以fastCGI的方式运行时文件系统权限问题及解决方法
2015/05/11 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
TP5多入口设置实例讲解
2020/12/15 PHP
PHP实现爬虫爬取图片代码实例
2021/03/03 PHP
JavaScript DOM 学习第五章 表单简介
2010/02/19 Javascript
JS实现文字链接感应鼠标淡入淡出改变颜色的方法
2015/02/26 Javascript
Bootstrap多级导航栏(级联导航)的实现代码
2016/03/08 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
2016/03/30 Javascript
Javascript iframe交互并兼容各种浏览器的解决方法
2016/07/12 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
2016/11/07 Javascript
浅谈JavaScript正则表达式-非捕获性分组
2017/03/08 Javascript
利用ES6实现单例模式及其应用详解
2017/12/09 Javascript
小程序实现列表点赞功能
2018/11/02 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
2020/02/24 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
详解Vue中的watch和computed
2020/11/09 Javascript
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
Python splitlines使用技巧
2008/09/06 Python
python缩进区别分析
2014/02/15 Python
Python入门篇之面向对象
2014/10/20 Python
合并百度影音的离线数据( with python 2.3)
2015/08/04 Python
Python的shutil模块中文件的复制操作函数详解
2016/07/05 Python
详解python3百度指数抓取实例
2016/12/12 Python
Django中的Signal代码详解
2018/02/05 Python
python清除函数占用的内存方法
2018/06/25 Python
VSCode中自动为Python文件添加头部注释
2019/11/14 Python
Python3并发写文件与Python对比
2019/11/20 Python
python之生成多层json结构的实现
2020/02/27 Python
新英格兰最大的特色礼品连锁店:The Paper Store
2018/07/23 全球购物
护士长2015年终工作总结
2015/04/24 职场文书
资金申请报告范文
2015/05/14 职场文书
高考1977观后感
2015/06/04 职场文书
学生病假条怎么写
2015/08/17 职场文书
PHP中多字节字符串操作实例详解
2021/08/23 PHP