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 相关文章推荐
刷新时清空文本框内容的js代码
Apr 23 Javascript
IE autocomplete internet explorer's autocomplete
Jun 30 Javascript
javascript 四则运算精度修正函数代码
May 31 Javascript
IE、FF、Chrome浏览器中的JS差异介绍
Aug 13 Javascript
JavaScript执行顺序详细介绍
Dec 04 Javascript
JavaScript学习小结(一)——JavaScript入门基础
Sep 02 Javascript
angular中的http拦截器Interceptors的实现
Feb 21 Javascript
jQuery实现jQuery-form.js实现异步上传文件
Apr 28 jQuery
JS实现的自定义map方法示例
May 17 Javascript
微信小程序商品详情页底部弹出框
Nov 22 Javascript
详解Vue3 Composition API中的提取和重用逻辑
Apr 29 Javascript
vue实现图书管理系统
Dec 29 Vue.js
低门槛开发iOS、Android、小程序应用的前端框架详解
Oct 16 #Javascript
基于angular实现树形二级表格
ajax请求前端跨域问题原因及解决方案
浅谈TypeScript 索引签名的理解
JavaScript 反射学习技巧
Oct 16 #Javascript
JS的深浅复制详细
Oct 16 #Javascript
JS 基本概念详细介绍
Oct 16 #Javascript
You might like
PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法
2009/05/28 PHP
CodeIgniter视图使用注意事项
2016/01/20 PHP
Laravel实现表单提交
2017/05/07 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
奇妙的js
2007/09/24 Javascript
ExtJS下grid的一些属性说明
2009/12/13 Javascript
Javascript Jquery 遍历Json的实现代码
2010/03/31 Javascript
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
Javascript简单实现可拖动的div
2013/10/22 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
javascript字母大小写转换的4个函数详解
2014/05/09 Javascript
14款NodeJS Web框架推荐
2014/07/11 NodeJs
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
基于jquery ui的alert,confirm方案(支持换肤)
2015/04/03 Javascript
JS实现简单路由器功能的方法
2015/05/27 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
Bootstrap基本组件学习笔记之导航(10)
2016/12/07 Javascript
canvas学习之API整理笔记(二)
2016/12/29 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
2017/03/03 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
解决Vue router-link绑定事件不生效的问题
2020/07/22 Javascript
js实现弹窗效果
2020/08/09 Javascript
jQuery实现简单三级联动效果
2020/09/05 jQuery
vue-video-player视频播放器使用配置详解
2020/10/23 Javascript
简单使用Python自动生成文章
2014/12/25 Python
在django项目中导出数据到excel文件并实现下载的功能
2020/03/13 Python
家长对老师的感言
2014/03/11 职场文书
道路建设实施方案
2014/03/18 职场文书
开业庆典主持词
2014/03/21 职场文书
优秀乡村医生事迹材料
2014/05/28 职场文书
投标授权委托书范文
2014/08/02 职场文书
公司租房协议书范本
2014/10/08 职场文书
2014财产信托协议书范本
2014/11/18 职场文书
2015年端午节国旗下演讲稿
2015/03/19 职场文书
苹果macOS 13开发者预览版Beta 8发布 正式版10月发布
2022/09/23 数码科技