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中的排序算法代码
Feb 22 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
Aug 12 Javascript
js 弹出新页面避免被浏览器、ad拦截的一种新方法
Apr 30 Javascript
了不起的node.js读书笔记之mongodb数据库交互
Dec 22 Javascript
Angular2中Bootstrap界面库ng-bootstrap详解
Oct 18 Javascript
JS判断微信扫码的方法
Aug 07 Javascript
vue.js input框之间赋值方法
Aug 24 Javascript
微信接入之获取用户头像的方法步骤
Sep 23 Javascript
highcharts.js数据绑定方式代码实例
Nov 13 Javascript
基于JavaScript获取url参数2种方法
Apr 17 Javascript
jQuery 移除事件的方法
Jun 20 jQuery
JS将指定的某个字符全部转换为其他字符实例代码
Oct 13 Javascript
低门槛开发iOS、Android、小程序应用的前端框架详解
Oct 16 #Javascript
基于angular实现树形二级表格
ajax请求前端跨域问题原因及解决方案
浅谈TypeScript 索引签名的理解
JavaScript 反射学习技巧
Oct 16 #Javascript
JS的深浅复制详细
Oct 16 #Javascript
JS 基本概念详细介绍
Oct 16 #Javascript
You might like
在PHP3中实现SESSION的功能(一)
2006/10/09 PHP
定义php常量的详解
2013/06/09 PHP
php教程之phpize使用方法
2014/02/12 PHP
php备份数据库类分享
2015/04/14 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
yii2.0框架实现上传excel文件后导入到数据库的方法示例
2020/04/13 PHP
你的编程语言可以这样做吗?
2006/09/07 Javascript
jquery防止重复执行动画避免页面混乱
2014/04/22 Javascript
node.js中的console.error方法使用说明
2014/12/10 Javascript
JQuery中模拟image的ajaxPrefilter与ajaxTransport处理
2015/06/19 Javascript
jQuery原理系列-css选择器的简单实现
2016/06/07 Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
p5.js绘制旋转的正方形
2019/10/23 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
在Vue中使用antv的示例代码
2020/06/29 Javascript
vue路由切换时取消之前的所有请求操作
2020/09/01 Javascript
react+antd 递归实现树状目录操作
2020/11/02 Javascript
Python实现简单状态框架的方法
2015/03/19 Python
Python字符串格式化输出方法分析
2016/04/13 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
2018/04/19 Python
django将网络中的图片,保存成model中的ImageField的实例
2019/08/07 Python
python智联招聘爬虫并导入到excel代码实例
2019/09/09 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
Django怎么在admin后台注册数据库表
2020/11/14 Python
Guess欧洲官网:美国服饰品牌
2019/08/06 全球购物
XMLHttpRequest对象在IE和Firefox中创建方式有没有不同
2016/03/23 面试题
公务员的自我鉴定
2013/10/26 职场文书
销售简历自我评价
2014/01/24 职场文书
财务会计求职信范文
2015/03/20 职场文书
Django分页器的用法你都了解吗
2021/05/26 Python
浅谈MySQL user权限表
2021/06/18 MySQL
Java 实现限流器处理Rest接口请求详解流程
2021/11/02 Java/Android
Win11怎么启动任务管理器?Win11启动任务管理器的几种方法
2021/11/23 数码科技
python 判断字符串当中是否包含字符(str.contain)
2022/06/01 Python
Redis实现主从复制方式(Master&Slave)
2022/06/21 Redis