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无限极树形菜单,json格式、数组格式通用示例
Jul 30 Javascript
node.js中的fs.ftruncate方法使用说明
Dec 15 Javascript
学习JavaScript设计模式(接口)
Nov 26 Javascript
Javascript简单实现面向对象编程继承实例代码
Nov 27 Javascript
JS实现支持Ajax验证的表单插件
Mar 24 Javascript
jQuery简单获取DIV和A标签元素位置的方法
Feb 07 Javascript
js实现类bootstrap模态框动画
Feb 07 Javascript
javascript定时器取消定时器及优化方法
Jul 08 Javascript
vue结合axios与后端进行ajax交互的方法
Jul 06 Javascript
Angular使用Restful的增删改
Dec 28 Javascript
javascript获取select值的方法完整实例
Jun 20 Javascript
小程序自定义模板实现吸顶功能
Jan 08 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文件下载类
2006/12/06 PHP
浅析PHP绘图技术
2013/07/03 PHP
php利用cookies实现购物车的方法
2014/12/10 PHP
PHP 实现代码复用的一个方法 traits新特性
2015/02/22 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
2016/09/11 PHP
阿里云PHP SMS短信服务验证码发送方法
2017/07/11 PHP
ThinkPHP框架整合微信支付之JSAPI模式图文详解
2019/04/09 PHP
自己写的Javascript计算时间差函数
2013/10/28 Javascript
AngularJS快速入门
2015/04/02 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
TypeScript入门-接口
2017/03/30 Javascript
使用Angular CLI生成 Angular 5项目教程详解
2018/03/18 Javascript
利用npm 安装删除模块的方法
2018/05/15 Javascript
JS求1到任意数之间的所有质数的方法详解
2019/05/20 Javascript
ES6对象操作实例详解
2020/05/23 Javascript
微信小程序实现拨打电话功能的示例代码
2020/06/28 Javascript
原生js 实现表单验证功能
2021/02/08 Javascript
跟老齐学Python之list和str比较
2014/09/20 Python
使用Python操作Elasticsearch数据索引的教程
2015/04/08 Python
对python中的高效迭代器函数详解
2018/10/18 Python
django迁移文件migrations的实现
2020/03/31 Python
Python字典dict常用方法函数实例
2020/11/09 Python
Python爬虫实现selenium处理iframe作用域问题
2021/01/27 Python
纯css3实现思维导图样式示例
2018/11/01 HTML / CSS
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
挪威太阳镜和眼镜网上商城:SmartBuyGlasses挪威
2016/08/20 全球购物
Dockers美国官方网站:卡其裤、男士服装、鞋及配件
2016/11/22 全球购物
党员个人思想汇报
2013/12/28 职场文书
自荐信格式简述
2014/01/25 职场文书
英语国培研修感言
2014/02/13 职场文书
本科毕业生应聘自荐信范文
2014/06/26 职场文书
个人股份转让协议书范本
2015/01/28 职场文书
2015军训通讯稿大全
2015/07/18 职场文书
python 开心网和豆瓣日记爬取的小爬虫
2021/05/29 Python
总结一些Java常用的加密算法
2021/06/11 Java/Android
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python