Javascript遍历对象怎么实现,有哪些方式
Admin 2022-06-29 群英技术资讯 551 次浏览
先来准备一个测试对象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" });
这个是对象遍历界的老兵了,通过这种方式可以遍历对象自身及继承的所有可枚举属性(不包括Symbol类型)。
代码清单2
for(var attr in obj){ console.log(attr,"==",obj[attr]); } /* job1 == 自有可枚举属性1 job2 == 自有可枚举属性2 name == 继承可枚举属性 */
获取对象自身所有可枚举属性(不包括Symbol类型)组成的数组
代码清单3
Object.keys(obj).map((attr)=>{ console.log(attr,"==",obj[attr]); }); /* job1 == 自有可枚举属性1 job2 == 自有可枚举属性2 */
获取对象自身所有类型为非Symbol的属性名称(包括不可枚举)组成的数组
代码清单4
Object.getOwnPropertyNames(obj).map((attr)=>{ console.log(attr,"==",obj[attr]); }); /* job1 == 自有可枚举属性1 job2 == 自有可枚举属性2 address == 自有不可枚举属性 */
获取对象自身所有类型为Symbol的属性名称(包括不可枚举)组成的数组
代码清单5
Object.getOwnPropertySymbols(obj).map((attr)=>{ console.log(attr,"==",obj[attr]); }); /* Symbol(自有可枚举symbol) == 自有可枚举symbol Symbol(自有不可枚举symbol) == 自有不可枚举symbol */
获取一个对象的自身的所有(包括不可枚举的和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合体的效果。
获取对象自身所有可枚举属性(不包括Symbol类型)的值组成的数组
代码清单7
Object.values(obj).map((val)=>{ console.log(val); }); /* 自有可枚举属性1 自有可枚举属性2 */
获取对象自身所有可枚举属性(不包括Symbol类型)的键值对数组
代码清单7
Object.entries(obj).map((val)=>{ console.log(val); }); /* [ 'job1', '自有可枚举属性1' ] [ 'job2', '自有可枚举属性2' ] */
检测一个对象自身属性中是否含有指定的属性,返回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 */
检测一个属性在指定的对象中是否可枚举,返回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
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
目录一、webpack介绍1、由来2、介绍3、作用4、拓展说明5、webpack整体认知二、webpack安装1、安装node2、安装cnpm3、安装nrm的两种方法4、安装webpack三、webpack配置0、搭建项目结构1、初始化一个项目(会创建一个package.json文件)2、在当前的项目中安装Webpac
在之前的文章中,我们带大家学习了JS中的几种循环控制结构(while和do-while循环、for循环),下面聊聊跳出循环语句break和continue,希望对大家有所帮助!
这篇文章主要介绍怎样用vue实现拖拽树状图,下文有实例有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章能有所收获,接下来小编带着大家一起了解看看。
这篇文章主要为大家详细介绍了jquery实现简单的弹窗效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这篇文章主要为大家详细介绍了微信小程序实现自定义底部导航,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008