JS遍历对象的七种方法-程序员宅基地

技术标签: 前端  javascript  开发语言  

我根据阮老师的《ES6标准入门》学习并总结了七种遍历对象的方法,我会将分别介绍这七种方法并进行详细的区分,并将从属性可枚举性问题与遍历方法两个大方面讲述全文,其中可枚举性是掌握遍历对象之前的的铺垫,请读者耐心学习,掌握遍历对象的七种方法!

属性的可枚举性

为什么要先说属性的可枚举性问题,因为一些方法会根据属性的可枚举型进行操作,其中遍历就是一种,遍历的一些方法会忽略掉可枚举属性值为false的属性,我知道到这里读者可能会有一些绕圈子:什么叫可枚举属性值为false的属性?下面我带大家来一探究竟

对象中的所有属性都具有一个描述对象,对你没有看错,其实在我们看到的一个普通对象中的每一个属性值都包含一对象,即描述对象,它是用来控制属性的行为

let obj = {
    name:"猪痞恶霸",
    age:20
} 

比如上面声明了一个普通的对象,含有nameage属性,这两个属性都具有一个描述对象,那我们怎么能拿到这个描述对象呢?

来看看这个方法:Object.getOwnPropertyDescriptor(),它可以拿到指定对象的某属性的描述对象,所以参数有两个,一个是指定对象,一共是指定对象的某属性

Object.getOwnPropertyDescriptor(obj,"name") 

如上图,我们拿到了obj对象name属性的描述对象,描述对象内就包含了我们想知道的东西,enumerable就是描述对象可枚举属性,那么在这个例子中值为true,所以就能解释上面那句看不懂的话:可枚举属性值为false的属性,在这里的解释就为:obj对象内的name属性的描述对象内的可枚举属性值为true

遍历对象

for…in

for...in可以遍历对象的所有可枚举属性,包括对象本身的和对象继承来的属性

let obj = {
    name:"ned",
    like:"man"
}
Object.defineProperty(obj, 'age', {
  value: "18",
  enumerable: false
});
for(item in obj) {
    console.log(item)
} 

看一看上面的例子,我们使用Object.defineProperty的形式来设置对象的描述对象,将其可枚举属性值设为false,使用for...in遍历,其没有被打印出来

其实for...in的特性会导致一个问题,其继承的属性会被遍历到,所以当我们不想要遍历被继承的属性,那么我们就可以使用Object.keys()

Object.keys()

Object.keys()方法可以遍历到所有对象本身的可枚举属性,但是其返回值为数组

let obj = {
    name:"ned",
    like:"man"
}
Object.keys(obj) //  ['name', 'like'] 

到这里我们一般是使用Object.keys()来代替for...in遍历操作,除此之外,为了代替for...in,又新增了与Object.keys()配套的遍历方法,下面我们来看看

Object.values()

Object.values()Object.keys()遍历对象的特性是相同的,但是其返回的结构是以遍历的属性值构成的数组

let obj = {
    name:"cornd",
    age:10
}
Object.values(obj) // ['cornd', 10]
Object.defineProperty(obj, 'like', {
  value: "coding",
  enumerable: false
});
Object.values(obj) // ['cornd', 10] 

声明了一个对象,使用Object.values()返回对象的所有自身可枚举属性的属性值,通过设置新的属性值并将其描述对象内的enumerable设置为false,就可以看到Object.values()的特性

Object.entries()

Object.entries()的返回值为Object.values()Object.keys()的结合,也就是说它会返回一个嵌套数组,数组内包括了属性名与属性值

let obj = {
    name:"cornd",
    age:10
}
Object.entries(obj) // [['name', 'cornd'],['age', 10]] 

其遍历特性与Object.values()Object.keys()相同,不再赘述。

Object.getOwnPropertyNames()

其返回结果与Object.keys()对应,但是他得特性与其相反,会返回对象得所有属性,包括了不可枚举属性

var arr = [];
console.log(Object.getOwnPropertyNames(arr)); // ['length']
Object.getOwnPropertyDescriptor(arr,"length").enumerable // false 

上面我声明了一个空数组,而使用Object.getOwnPropertyNames()方法,返回了length,而length属性的enumerable正是false

Object.getOwnPropertySymbols()

Object.getOwnPropertySymbols()会返回对象内的所有Symbol属性,返回形式依旧是数组,值得注意的是,在对象初始化的时候,内部是不会包含任何Symbol属性

let obj = {
    name:"obj"
}
Object.getOwnPropertySymbols(obj) // [] 

所以我初始化一个对象,通过这个方法返回的是一个空数组

let sym = Symbol()
console.log(sym)
obj[sym] = "hogskin" 
Object.getOwnPropertySymbols(obj) // Symbol() 

我在后面新建symbol,再为上面声明好的对象添加进去,通过遍历得到Symbol()

Reflect.ownKeys()

Reflect.ownKeys()返回的是一个大杂烩数组,即包含了对象的所有属性,无论是否可枚举还是属性是symbol,还是继承,将所有的属性返回

let arr = [0,31,2]
Reflect.ownKeys(arr) // ['0', '1', '2', 'length'] 

上面的例子声明了一个数组,返回的是数组下标和length属性。

区分

为了跟好的记忆理解并掌握这七种方法,我根据遍历目标,返回形式,遍历值三个维度将七种方法区分起来。

根据遍历目标区分

遍历目标 方法
遍历对象本身的可枚举属性不包含继承来的属性(不包括Symbol() Object.keys()Object.values()Object.entries()
遍历对象本身的可枚举属性包括继承来的属性(不包括Symbol() for...in
遍历对象本身的所有属性(不包括Symbol() Object.getOwnPropertyNames()
遍历对象的Symbol()属性 Object.getOwnPropertySymbols()
遍历对象的所有属性 Reflect.ownKeys()

根据返回值区分

返回值 方法
返回数组 `Object.keys()Object.values()Object.entries()Object.getOwnPropertyNames()Object.getOwnPropertySymbols()Reflect.ownKeys()
不返回值 for...in

根据遍历值区分

遍历值 方法
遍历属性 Reflect.ownKeys()Object.getOwnPropertyNames()Object.keys()
遍历属性值 Object.getOwnPropertySymbols()Object.values()
遍历全部 for...inObject.entries()

最后

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,有需要的小伙伴,可以【点下方卡片】免费领取:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_53225741/article/details/127073295

智能推荐

逻辑回归(混淆矩阵与评估指标)_多变量逻辑回归分析-程序员宅基地

文章浏览阅读3.3k次。跟我一起机器学习系列文章将首发于公众号:月来客栈,欢迎文末扫码关注!1 多变量逻辑回归上一篇文章中笔者对于什么是逻辑回归,以及它能用来干什么做了一个详细的介绍;同时,对于如何通过开源库进行建模训练并预测也给出了详细的示例,并对训练得到的决策边界进行了可视化。因此,本篇文章将主要围绕多变量逻辑回归,多分类问题和分类评价指标这三个方面进行介绍。所为多变量逻辑回归其实就是一个样本点有多个特征属性..._多变量逻辑回归分析

使用EM管理实例-程序员宅基地

文章浏览阅读96次。repository就是存放Database Control在管理数据库所用到的信息的多个表。创建repository:emca -repos create创建Database Control:emc..._#./em_control -l

C++1-C语言和C++的区别_c语言++1-程序员宅基地

文章浏览阅读2.8k次。C语言和C++的区别_c语言++1

无人机项目跟踪记录七十二———降压电路模块详解_怎样看降压模块是几v生成的-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏4次。下图为降压电路模块:从左向右介绍,MIC5205_3.3为输出是3.3伏的电压调节器件。VIN接入5伏电压,GND管脚接地,EN使能端接5伏电压代表芯片不受其他信号控制,固定输出3.3V电压。本电路不考虑噪声影响,故而BYP端不接电容。输出端接三个电容起到滤波作用。左侧电路给单片机和系统其他芯片提供3.3伏的电压。右侧和左侧基本相同,不同的是使能管脚EN受单片机控制,以此来启动或者关闭此供电模块,右侧电路是给蓝牙芯片供电电路。..._怎样看降压模块是几v生成的

Qt 生成一个固定长度的随机字符串_qt 获取随机数 固定长度-程序员宅基地

文章浏览阅读5.5k次,点赞4次,收藏20次。概述我们都知道,使用Qt的qrand()可以生成一个随机的数字,比如说,要生成100以内的随机数,可以使用qrand()%100 来实现,那么如果要生成一个固定长度的随机字符串该怎么弄呢,其实原理很简单,就是事先准备好一个字符串数组,然后结合qrand()函数随机从字符串数组中通过循环取出来就可以啦。代码实现原理已经说过了,其实就是一个非常简单的算法,直接看代码:QString getRa..._qt 获取随机数 固定长度

itemchanged相關_powerbuilder itemchanged return-程序员宅基地

文章浏览阅读676次。 第一个疑问: 1、itemchanged: return 1 这里不接受变化数据,不允许移动焦点 2、itemerror: return 3 这里不接受变化数据,允许移动焦点return 1 发现事件触发情况为:itemchanged-->itemerror-->itemchanged-->itemerror. 为什么是两次? 第二个疑问: 1、itemchanged: return_powerbuilder itemchanged return

随便推点

html弹窗是否删除,javascript删除前弹出确认/取消询问窗口confirm-程序员宅基地

文章浏览阅读4.1k次。为了避免误删数据,删除前应该不要嫌麻烦弹出一个确认/取消询问窗口,以前免错删数据后无法恢复。网站的数据删除由用 户在客户端发起,所以弹出确认/取消询问窗口由javascript来完成,它弹出的询问窗口跟Windows系统弹出的一样。javascript删除前弹出一个确认/取消询问窗口有几种方法,我们只介绍一种方便调用的方法,这样既便于在 javascript 代码中调用,又便于在 html 文件中..._html 删除前询问

关于三星S3C44B0X目标板的uClinux Bootloader_uclinux和bootloader区别-程序员宅基地

文章浏览阅读386次。2007-12-25 09:13:59 uClinux是为控制领域设计的嵌入式Linux操作系统,它沿袭了主流Linux的大部分特性,并进行了一定幅度的裁减。其设计主要针对没有内存管理单元(MMU)的微处理器,例如基于ARM7TDMI内核的S3C44B0X。 嵌入式Linux系统通常由三部份组成:Bootloader、Kernel和File System_uclinux和bootloader区别

iOS 防止截屏、录屏技术_ios 禁止录屏-程序员宅基地

文章浏览阅读4.1k次。看图演示,可防止截屏和录屏可以开启或者关闭,是否允许截屏和录屏。_ios 禁止录屏

机器人路径规划之RRT算法-程序员宅基地

文章浏览阅读2.3k次,点赞3次,收藏32次。关注:决策智能与机器学习,深耕AI脱水干货作者:矮脚兽 来源:知乎专栏地址:https://www.zhihu.com/column/c_1278371819016101888如需转载..._六自由度机械臂rrt路径规划原理

CentOS 7.2下KVM虚拟化配置以及常用操作_部署kvm 修改存储路径-程序员宅基地

文章浏览阅读804次。分享CentOS7.2下KVM虚拟化配置以及常用操作的步骤。1.开始安装kvma.检查你的系统是否支持虚拟化grep -Ei 'vmx|svm' /proc/cpuinfo如果有输出内容,则支持,其中intelcpu支持会有vmx,amd cpu支持会有svmb.通过yum安装虚拟化的软件包 1 2 yuminstall-ykvmvirt-* libvirt bridge-utilsqemu-img virt-install..._部署kvm 修改存储路径

维纳滤波原理极其Python实现_python 维纳滤波参数-程序员宅基地

文章浏览阅读4.2k次,点赞2次,收藏16次。从信号与系统的角度出发,有一部分噪声是系统的固有噪声,另一部分,则是对信号的某种响应,换言之,这部分噪声可以理解为一个噪声系统。所以滤除后者,可以理解为去除噪声系统的影响,换言之,就是针对噪声系统做反卷积。考虑到求比证难,不妨把这个问题再简化一下,如果找到了一组值,那么如何确定这组值是对的?如果噪声系统可以测量,那么反卷积自然可以顺利执行,否则那就要对这个噪声系统进行估计,维纳滤波履行的就是这个思路。,然后找到这个误差量的某个统计值的极值,考虑到正负号的问题,这个统计量有可能是方差。为系统的噪声,如果为。_python 维纳滤波参数

推荐文章

热门文章

相关标签