javascript遍历对象的五种方式实例代码


Posted in Javascript onOctober 24, 2021

准备

先来准备一个测试对象obj。

代码清单1

var notEnum = Symbol("继承不可枚举symbol");
var proto = {
    [Symbol("继承可枚举symbol")]: "继承可枚举symbol",
    name: "继承可枚举属性"
};
// 不可枚举属性
Object.defineProperty(proto, "age", {
    value: "继承不可枚举属性"
});
// 不可枚举symbol属性
Object.defineProperty(proto, notEnum, {
    value: "继承不可枚举symbol"
});

var obj = {
    job1: "自有可枚举属性1",
    job2: "自有可枚举属性2",
    [Symbol("自有可枚举symbol")]: "自有可枚举symbol"
};
// 继承
Object.setPrototypeOf(obj, proto);
// 不可枚举属性
Object.defineProperty(obj, "address", {
    value: "自有不可枚举属性"
});
// 不可枚举symbol属性
var ownNotEnum = Symbol("自有不可枚举symbol");
Object.defineProperty(obj, ownNotEnum, {
    value: "自有不可枚举symbol"
});

五种武器

for…in

这个是对象遍历界的老兵了,通过这种方式可以遍历对象自身及继承的所有可枚举属性(不包括Symbol类型)。

代码清单2

for(var attr in obj){
    console.log(attr,"==",obj[attr]);
}
/*
job1 == 自有可枚举属性1
job2 == 自有可枚举属性2
name == 继承可枚举属性
*/

Object.keys

获取对象自身所有可枚举属性(不包括Symbol类型)组成的数组

代码清单3

Object.keys(obj).map((attr)=>{
    console.log(attr,"==",obj[attr]);
});
/*
job1 == 自有可枚举属性1
job2 == 自有可枚举属性2
*/

Object.getOwnPropertyNames

获取对象自身所有类型为非Symbol的属性名称(包括不可枚举)组成的数组

代码清单4

Object.getOwnPropertyNames(obj).map((attr)=>{
    console.log(attr,"==",obj[attr]);
});
/*
job1 == 自有可枚举属性1
job2 == 自有可枚举属性2
address == 自有不可枚举属性
*/

Object.getOwnPropertySymbols

获取对象自身所有类型为Symbol的属性名称(包括不可枚举)组成的数组

代码清单5

Object.getOwnPropertySymbols(obj).map((attr)=>{
    console.log(attr,"==",obj[attr]);
});
/*
Symbol(自有可枚举symbol) == 自有可枚举symbol
Symbol(自有不可枚举symbol) == 自有不可枚举symbol
*/

Reflect.ownKeys

获取一个对象的自身的所有(包括不可枚举的和Symbol类型)的属性名称组成的数组

代码清单6

Reflect.ownKeys(obj).map((attr)=>{
    console.log(attr,"==",obj[attr]);
});
/*
job1 == 自有可枚举属性1
job2 == 自有可枚举属性2
address == 自有不可枚举属性
Symbol(自有可枚举symbol) '==' '自有可枚举symbol'
Symbol(自有不可枚举symbol) '==' '自有不可枚举symbol'
*/

总结

武器库的说明书,根据需要选择合适的武器吧。

api 操作 自身属性 不可枚举属性 继承属性 Symbol属性
for…in 遍历 yes no yes no
Object.keys 返回属性数组 yes no no no
Object.getOwnPropertyNames 返回非Symbol属性数组 yes yes no no
Object.getOwnPropertySymbols 返回Symbol属性数组 yes yes no yes
Reflect.ownKeys 返回属性数组 yes yes no yes

五种武器里最牛的就是Reflect.ownKeys了,无论Symbol还是不可枚举通吃, 简直就是Object.getOwnPropertyNames和Object.getOwnPropertySymbols合体的效果。

扩展

Object.values

获取对象自身所有可枚举属性(不包括Symbol类型)的值组成的数组

代码清单7

Object.values(obj).map((val)=>{
    console.log(val);
});
/*
自有可枚举属性1
自有可枚举属性2
*/

Object.entries

获取对象自身所有可枚举属性(不包括Symbol类型)的键值对数组

代码清单7

Object.entries(obj).map((val)=>{
    console.log(val);
});
/*
[ 'job1', '自有可枚举属性1' ]
[ 'job2', '自有可枚举属性2' ]
*/

hasOwnProperty

检测一个对象自身属性中是否含有指定的属性,返回boolean

引用自MDN: JavaScript 并没有保护 hasOwnProperty 属性名,因此某个对象是有可能存在使用这个属性名的属性,所以直接使用原型链上的 hasOwnProperty 方法

代码清单8

for(var attr in obj){
    if(Object.prototype.hasOwnProperty.call(obj,attr)){
        console.log("自有属性::",attr);
    }else{
        console.log("继承属性::",attr);
    }
}
/*
自有属性:: job1
自有属性:: job2
继承属性:: name
*/

propertyIsEnumerable

检测一个属性在指定的对象中是否可枚举,返回boolean

代码清单9

Reflect.ownKeys(obj).map((attr) => {
    if (Object.prototype.propertyIsEnumerable.call(obj, attr)) {
        console.log("可枚举属性::", attr);
    } else {
        console.log("不可枚举属性::", attr);
    }
});
/*
可枚举属性:: job1
可枚举属性:: job2
不可枚举属性:: address
可枚举属性:: Symbol(自有可枚举symbol)
不可枚举属性:: Symbol(自有不可枚举symbol)
*/

参考

MDN Object

总结

到此这篇关于javascript遍历对象的五种方式的文章就介绍到这了,更多相关javascript遍历对象内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript验证上传文件的类型限制必须为某些格式
Nov 14 Javascript
javascript中的取反再取反~~没有意义
Apr 06 Javascript
浅析jQuery移动开发中内联按钮和分组按钮的编写
Dec 04 Javascript
jQuery EasyUI 入门必看
Jun 03 Javascript
Bootstrap选项卡与Masonry插件的完美结合
Jul 06 Javascript
JavaScript中捕获与冒泡详解及实例
Feb 03 Javascript
Vuex之理解Getters的用法实例
Apr 19 Javascript
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
Jun 13 Javascript
jquery实现左右轮播切换效果
Jan 01 jQuery
Router解决跨模块下的页面跳转示例
Jan 11 Javascript
VUE组件中的 Drawer 抽屉实现代码
Aug 06 Javascript
weui中的picker使用js进行动态绑定数据问题
Nov 06 Javascript
低门槛开发iOS、Android、小程序应用的前端框架详解
Oct 16 #Javascript
基于angular实现树形二级表格
ajax请求前端跨域问题原因及解决方案
浅谈TypeScript 索引签名的理解
JavaScript 反射学习技巧
Oct 16 #Javascript
JS的深浅复制详细
Oct 16 #Javascript
JS 基本概念详细介绍
Oct 16 #Javascript
You might like
CodeIgniter使用phpcms模板引擎
2013/11/12 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
2014/06/30 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
2014/07/02 PHP
PHP实现即时输出、实时输出内容方法
2015/05/27 PHP
PHP Ajax跨域问题解决方案代码实例
2020/08/01 PHP
JQuery 无废话系列教程(二) jquery实战篇上
2009/06/23 Javascript
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
js获取单选框或复选框值及操作
2012/12/18 Javascript
js中switch case循环实例代码
2013/12/30 Javascript
extjs 分页使用jsp传递数据示例
2014/07/29 Javascript
JQuery $.each遍历JavaScript数组对象实例
2014/09/01 Javascript
一道优雅面试题分析js中fn()和return fn()的区别
2016/07/05 Javascript
AngularJS 与百度地图的结合实例
2016/10/20 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
javascript滚轮事件基础实例讲解(37)
2017/02/14 Javascript
vue better-scroll插件使用详解
2018/01/25 Javascript
jQuery AJAX与jQuery事件的分析讲解
2019/02/18 jQuery
详解如何探测小程序返回到webview页面
2019/05/14 Javascript
electron实现静默打印的示例代码
2019/08/12 Javascript
python dict remove数组删除(del,pop)
2013/03/24 Python
Python中使用摄像头实现简单的延时摄影技术
2015/03/27 Python
python获取当前用户的主目录路径方法(推荐)
2017/01/12 Python
Python使用sftp实现上传和下载功能(实例代码)
2017/03/14 Python
PyTorch上实现卷积神经网络CNN的方法
2018/04/28 Python
python字典的遍历3种方法详解
2019/08/10 Python
python标识符命名规范原理解析
2020/01/10 Python
远程调用的原理
2014/07/05 面试题
集团公司总经理岗位职责
2013/12/20 职场文书
后备干部考察材料
2014/02/12 职场文书
优秀驾驶员先进事迹材料
2014/05/04 职场文书
党员先锋岗事迹材料
2014/05/08 职场文书
村主任群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
公司授权委托书格式样本
2014/10/01 职场文书
本科毕业论文导师评语
2014/12/31 职场文书
商务司机岗位职责
2015/04/10 职场文书
apache基于端口创建虚拟主机的示例
2021/04/24 Servers