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 相关文章推荐
仿服务器端脚本方式的JS模板实现方法
Apr 27 Javascript
3Z版基于jquery的图片复选框(asp.net+jquery)
Apr 12 Javascript
$(document).ready(function() {})不执行初始化脚本
Jun 19 Javascript
jquery实现鼠标滑过显示提示框的方法
Feb 05 Javascript
在JavaScript中如何解决用execCommand(
Oct 19 Javascript
JavaScrpt中如何使用 cookie 设置查看与删除功能
Jul 09 Javascript
使用重写url机制实现验证码换一张功能
Aug 01 Javascript
React Form组件的实现封装杂谈
May 07 Javascript
vue引入axios同源跨域问题
Sep 27 Javascript
详解微信小程序文件下载--视频和图片
Apr 24 Javascript
vue.js 2.0实现简单分页效果
Jul 29 Javascript
vue-socket.io跨域问题有效解决方法
Feb 11 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网页游戏学习之Xnova(ogame)源码解读(十五)
2014/06/30 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
PHP实现PDO的mysql数据库操作类
2014/12/12 PHP
PHP 使用redis简单示例分享
2015/03/05 PHP
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
JS实现超炫网页烟花动画效果的方法
2015/03/02 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
折叠菜单及选择器的运用
2017/02/03 Javascript
Angular4学习笔记之根模块与Ng模块
2017/09/09 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
vue 进阶之实现父子组件间的传值
2019/04/26 Javascript
用js简单提供增删改查接口
2019/05/12 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
2019/08/20 Javascript
[05:05]DOTA2亚洲邀请赛 战队出场仪式
2015/02/07 DOTA
[37:37]DAC2018 4.4 淘汰赛 Optic vs Mineski 第二场
2018/04/05 DOTA
python实现批量转换文件编码(批转换编码示例)
2014/01/23 Python
python自动化测试实例解析
2014/09/28 Python
python编写的最短路径算法
2015/03/25 Python
Python并发编程协程(Coroutine)之Gevent详解
2017/12/27 Python
Python实现图片尺寸缩放脚本
2018/03/10 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
在Python文件中指定Python解释器的方法
2019/02/18 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
2020/01/20 Python
在keras下实现多个模型的融合方式
2020/05/23 Python
在Keras中实现保存和加载权重及模型结构
2020/06/15 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
Python 中的函数装饰器和闭包详解
2021/02/06 Python
全球性的在线时尚男装零售商:boohooMAN
2016/12/17 全球购物
大学生优秀自荐信范文
2014/02/25 职场文书
青奥会口号
2014/06/12 职场文书
教师考核表个人总结
2015/02/12 职场文书
个人德育工作总结
2015/03/05 职场文书
《当代神农氏》教学反思
2016/02/23 职场文书
利用python进行数据加载
2021/06/20 Python
MySQL中几种插入和批量语句实例详解
2021/09/14 MySQL
「月刊Comic Alive」2022年5月号封面公开
2022/03/21 日漫