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 相关文章推荐
基于jquery的鼠标拖动效果代码
May 30 Javascript
JavaScript charCodeAt方法入门实例(用于取得指定位置字符的Unicode编码)
Oct 17 Javascript
JavaScript节点及列表操作实例小结
Aug 05 Javascript
巧用canvas
Jan 21 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
Mar 03 Javascript
JS 组件系列之BootstrapTable的treegrid功能
Jun 16 Javascript
ReactJs实现树形结构的数据显示的组件的示例
Aug 18 Javascript
简单谈谈vue的过渡动画(推荐)
Oct 11 Javascript
p5.js入门教程之图片加载
Mar 20 Javascript
Vue下路由History模式打包后页面空白的解决方法
Jun 29 Javascript
浅谈angular2子组件的事件传递(任意组件事件传递)
Sep 30 Javascript
JavaScript实现点击图片换背景
Nov 20 Javascript
低门槛开发iOS、Android、小程序应用的前端框架详解
Oct 16 #Javascript
基于angular实现树形二级表格
ajax请求前端跨域问题原因及解决方案
浅谈TypeScript 索引签名的理解
JavaScript 反射学习技巧
Oct 16 #Javascript
JS的深浅复制详细
Oct 16 #Javascript
JS 基本概念详细介绍
Oct 16 #Javascript
You might like
微博短链接算法php版本实现代码
2012/09/15 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
Yii支持多域名cors原理的实现
2018/12/05 PHP
Thinkphp5.0 框架Model模型简单用法分析
2019/10/11 PHP
用脚本调用样式的几种方法
2006/12/09 Javascript
用 javascript 实现的点击复制代码
2007/03/24 Javascript
js loading加载效果实现代码
2009/11/24 Javascript
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
JS的replace方法介绍
2012/10/20 Javascript
很好用的js日历算法详细代码
2013/03/07 Javascript
原生js实现可爱糖果数字时间特效
2016/12/30 Javascript
angularjs项目的页面跳转如何实现(5种方法)
2017/05/25 Javascript
vue2.0 父组件给子组件传递数据的方法
2018/01/15 Javascript
Angular使用cli生成自定义文件、组件的方法
2018/09/04 Javascript
用Electron写个带界面的nodejs爬虫的实现方法
2019/01/29 NodeJs
mpvue实现左侧导航与右侧内容的联动
2019/10/21 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
js异步接口并发数量控制的方法示例
2020/11/22 Javascript
Python 匹配任意字符(包括换行符)的正则表达式写法
2009/10/29 Python
编写简单的Python程序来判断文本的语种
2015/04/07 Python
Python sorted函数详解(高级篇)
2018/09/18 Python
Python装饰器用法实例分析
2019/01/14 Python
PyQt5实现五子棋游戏(人机对弈)
2020/03/24 Python
Python 根据数据模板创建shapefile的实现
2019/11/26 Python
python通过matplotlib生成复合饼图
2020/02/06 Python
python 删除系统中的文件(按时间,大小,扩展名)
2020/11/19 Python
钉钉企业内部H5微应用开发详解
2020/05/12 HTML / CSS
Schutz鞋官方网站:Schutz Shoes
2017/12/13 全球购物
函授本科毕业生自我鉴定
2013/10/16 职场文书
幼儿园运动会入场词
2014/02/10 职场文书
《小熊住山洞》教学反思
2014/02/21 职场文书
团日活动总结书
2014/05/08 职场文书
2014年工会工作总结
2014/11/12 职场文书
法定代表人资格证明书
2015/06/18 职场文书
电工实训心得体会
2016/01/14 职场文书
公司晚会主持词
2019/04/17 职场文书