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 相关文章推荐
爱恋千雪-US-AscII加密解密工具(网页加密)下载
Jun 06 Javascript
JS面向对象编程 for Cookie
Sep 19 Javascript
JavaScript高级程序设计 XML、Ajax 学习笔记
Sep 10 Javascript
Jquery插件之打造自定义的select标签
Nov 30 Javascript
jQuery打印指定区域Html页面并自动分页
Jul 04 Javascript
使用JQuery实现的分页插件分享
Nov 05 Javascript
JavaScript生成.xls文件的代码
Dec 22 Javascript
JavaScript中双符号的运算详解
Mar 12 Javascript
详解Node.js access_token的获取、存储及更新
Jun 20 Javascript
Vue计算属性的使用
Aug 04 Javascript
iview的table组件自带的过滤器实现
Jul 12 Javascript
node中使用log4js4.x版本记录日志的方法
Aug 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验证码实现代码
2014/05/10 PHP
PHP实现对站点内容外部链接的过滤方法
2014/09/10 PHP
PHP的引用详解
2015/02/22 PHP
Yii2 rbac权限控制之菜单menu实例教程
2016/04/28 PHP
PHP实现截取中文字符串不出现?号的解决方法
2016/12/29 PHP
PHP处理Ajax请求与Ajax跨域问题
2017/02/13 PHP
php利用ob_start()清除输出和选择性输出的方法
2018/01/18 PHP
PHP实现正则表达式分组捕获操作示例
2018/02/03 PHP
PHP Trait代码复用类与多继承实现方法详解
2019/06/17 PHP
jQuery Autocomplete自动完成插件
2010/07/17 Javascript
Javascript实现动态菜单添加的实例代码
2013/07/05 Javascript
javascript实现显示和隐藏div方法汇总
2015/08/14 Javascript
javascript中for/in循环及使用技巧
2015/09/01 Javascript
BootStrap和jQuery相结合实现可编辑表格
2016/04/21 Javascript
jQuery+HTML5实现弹出创意搜索框层
2016/12/29 Javascript
Vue.js展示AJAX数据简单示例讲解
2017/03/29 Javascript
Angular限制input框输入金额(是小数的话只保留两位小数点)
2017/07/13 Javascript
NW.js 简介与使用方法
2018/02/01 Javascript
nodejs中密码加密处理操作详解
2018/03/20 NodeJs
详解swipe使用及竖屏页面滚动方法
2018/06/28 Javascript
node.js事件轮询机制原理知识点
2019/12/22 Javascript
Python实现简单过滤文本段的方法
2017/05/24 Python
python里使用正则表达式的组嵌套实例详解
2017/10/24 Python
python数字图像处理之骨架提取与分水岭算法
2018/04/27 Python
python pycurl验证basic和digest认证的方法
2018/05/02 Python
Python3使用turtle绘制超立方体图形示例
2018/06/19 Python
django数据库自动重连的方法实例
2019/07/21 Python
python应用文件读取与登录注册功能
2019/09/23 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
2020/02/27 Python
canvas实现圆绘制的示例代码
2019/09/11 HTML / CSS
给客户的道歉信
2014/01/13 职场文书
元旦晚会邀请函
2014/01/27 职场文书
恶搞卫生巾广告词
2014/03/18 职场文书
群众路线问题查摆对照检查材料
2014/10/04 职场文书
卖房授权委托书样本
2014/10/05 职场文书
A22国内电台短波广播频率表
2022/05/10 无线电