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级联下拉菜单以及AJAX数据验证核心代码
May 10 Javascript
javascript + jquery实现定时修改文章标题
Mar 19 Javascript
js实现获取焦点后光标在字符串后
Sep 17 Javascript
jquery实现倒计时效果
Dec 14 Javascript
分享javascript计算时间差的示例代码
Mar 19 Javascript
学习JavaScript设计模式之享元模式
Jan 18 Javascript
第六章之辅组类与响应式工具
Apr 25 Javascript
AngularJs Forms详解及简单示例
Sep 01 Javascript
修改ligerui 默认确认按钮的方法
Dec 27 Javascript
javascript 中iframe高度自适应(同域)实例详解
May 16 Javascript
解决Vue中 父子传值 数据丢失问题
Aug 27 Javascript
解决antd Form 表单校验方法无响应的问题
Oct 27 Javascript
低门槛开发iOS、Android、小程序应用的前端框架详解
Oct 16 #Javascript
基于angular实现树形二级表格
ajax请求前端跨域问题原因及解决方案
浅谈TypeScript 索引签名的理解
JavaScript 反射学习技巧
Oct 16 #Javascript
JS的深浅复制详细
Oct 16 #Javascript
JS 基本概念详细介绍
Oct 16 #Javascript
You might like
完美解决dedecms中的[html][/html]和[code][/code]问题
2007/03/20 PHP
php生成过去100年下拉列表的方法
2015/07/20 PHP
PHP+swoole实现简单多人在线聊天群发
2016/01/19 PHP
Laravel中间件实现原理详解
2016/10/09 PHP
javascript 触发事件列表 比较不错
2009/09/03 Javascript
javascript中利用数组实现的循环队列代码
2010/01/24 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
分享两个手机访问pc网站自动跳转手机端网站代码
2020/12/24 Javascript
asp.net中oracle 存储过程(图文)
2015/08/12 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
jQuery Ajax实现跨域请求
2017/01/21 Javascript
JavaScript面试技巧之数组的一些不low操作
2019/03/22 Javascript
JavaScript生成随机验证码代码实例
2019/09/28 Javascript
VUE-ElementUI 自定义Loading图操作
2020/11/11 Javascript
Python 随机生成中文验证码的实例代码
2013/03/20 Python
python在windows命令行下输出彩色文字的方法
2015/03/19 Python
python入门基础之用户输入与模块初认识
2016/11/14 Python
Python基于递归算法实现的走迷宫问题
2017/08/04 Python
Python实现将照片变成卡通图片的方法【基于opencv】
2018/01/17 Python
python操作oracle的完整教程分享
2018/01/30 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
django 修改server端口号的方法
2018/05/14 Python
python的pip安装以及使用教程
2018/09/18 Python
selenium3+python3环境搭建教程图解
2018/12/07 Python
python调用c++ ctype list传数组或者返回数组的方法
2019/02/13 Python
django model通过字典更新数据实例
2020/04/01 Python
python爬取音频下载的示例代码
2020/10/19 Python
Oakley西班牙官方商店:太阳眼镜和男女运动服
2019/04/26 全球购物
科室工作个人总结的自我评价
2013/10/29 职场文书
简单的项目建议书模板
2014/03/12 职场文书
积极贯彻学习两会精神总结
2014/03/17 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
新闻发布会新闻稿
2015/07/17 职场文书
Python+uiautomator2实现自动刷抖音视频功能
2021/04/29 Python
java设计模式--三种工厂模式详解
2021/07/21 Java/Android