大家好,我来了,本期为大家带来的前端开发知识是”Web前端:怎么在JavaScript中比较对象?“,有兴趣做前端的朋友,一起来看看吧!

比较JavaScript中的原始值很简单。您需要做的是使用任何可用的等价运算符,例如严格相等运算符:

对象具有结构化数据,因此比较起来比较困难。在本文中,您将学习如何正确比较JavaScript中的对象。

1.参照相等

JavaScript提供了3种比较值的方法:

  • 松散相等运算符 ===
  • 严格相等运算符 ==
  • Object.is() 功能

使用这些对象中的任何一个进行对象比较时,true只有在比较值指向同一对象实例时,比较的结果才为。这就是参照相等

让我们定义2个对象hero1hero2,并在实践中查看引用相等性:

hero1 === hero1true由于两个操作数都指向同一个对象实例,因此求值hero1

另一方面,由于操作数和是不同的对象实例,因此hero1 === hero2求值为。 falsehero1hero2

有趣的是hero1hero2对象具有相同的内容:两个对象都有一个name具有value的属性'Batman'。尽管如此,即使比较相同结构的对象,其结果也hero1 === hero2false

当您想比较对象引用而不是它们的内容时,引用相等很有用。但是,在大多数情况下,您想比较对象的实际内容:属性及其值。

让我们看看如何通过对象的内容比较对象是否相等。

2.手动比较

按内容比较对象的明显方法是访问属性并手动比较它们。

例如,让我们编写一个isHeroEqual()比较两个英雄对象的特殊函数:

isHeroEqual()访问name两个对象的属性并进行比较。

如果被比较的对象具有一些属性,我喜欢isHeroEqual()手动编写比较函数。它们具有良好的性能:比较中只涉及少数几个属性访问者和相等运算符。

手动比较需要手动提取属性-对于简单对象,这不是问题。但是,要比较较大的对象(或结构未知的对象),手动比较不方便,因为它需要大量样板代码。

让我们看看对象的浅层平等如何提供帮助。

3.浅薄的平等

在对象的浅层相等检查期间,您必须获取属性列表(使用Object.keys()),然后检查属性的值是否相等。

这是对象的浅层相等检查的可能实现:

在函数内部,keys1并且keys2是包含相应的属性名称数组object1object2

for循环遍历的密钥,并且每个属性的比较object1object2是否相等object1[k1] !== object2[k2]

现在,使用浅等式可以检查许多属性的对象:

shallowEqual(hero1, hero2)true之所以返回,是因为对象hero1hero2具有相同的属性(namerealName)和相同的值。

在另一边,shallowEqual(hero1, hero3)回报false因为hero1hero3具有不同的属性。

但是JavaScript中的对象可以嵌套。不幸的是,在这种情况下,浅浅的平等并不能很好地发挥作用。

让我们对具有其他嵌套对象的对象执行浅表相等:

这个时候,即使这两个对象hero1,并hero2具有相同的内容,shallowEqual(hero1, hero2)返回false

发生这种情况是因为嵌套的对象hero1.addresshero2.address是不同的对象实例。因此,浅等式认为 hero1.addresshero2.address是不同的值。

解决嵌套对象的问题有助于对对象进行深度相等性检查。

4.深层平等

深度相等检查有助于对包含其他对象(也称为嵌套对象)的对象执行相等检查。

深层平等检查类似于对象的浅层平等检查,不同之处在于,当一个属性具有一个对象时,另一个递归浅层平等检查将在该对象上开始。

让我们看一下深度相等检查的实现:

高亮显示的行areObjects && !deepEqual(val1, val2)指示一旦检查的属性是对象,则递归调用开始以验证嵌套对象是否也相等。

现在,我们使用deepEquality()来比较具有嵌套对象的对象:

深度相等函数正确地确定hero1hero2具有相同的属性和值,包括嵌套对象hero1.address和的相等性hero2.address

深入比较的对象,我建议使用isDeepStrictEqual(object1,对象2)的节点内置util模块或_.isEqual(object1,对象2)的lodash库。

5.总结

的参考平等(使用=====Object.is())确定操作数是否是同一物体的实例。

手动检查对象是否相等需要对属性值进行手动比较。尽管此检查需要手动编写属性检查,但由于其简单性,我经常发现此方法很方便。

当被比较的对象具有许多属性或在运行时确定对象的结构时,更好的方法是使用浅层检查。

如果比较的对象具有嵌套对象,则进行深度相等检查是一种方法。

希望我的帖子可以帮助您了解检查JavaScript中对象的细节。

JSON.stringify(object1) === JSON.stringify(object2)用于比较对象的主要问题是什么?

原著作者:德米特里·帕夫鲁汀

文章来源:国外

原著链接:

Dmitri Pavlutin Blog​dmitripavlutin.com

PS:原著文章内容为英文版本,建议使用360极速浏览器进行翻译阅读。

name optimize is not defined 怎么解决_Web前端:怎么在JavaScript中比较对象?相关推荐

  1. 解决2020版IDEA的JAVAScript中找不到vue.js问题

    解决2020版IDEA的JAVAScript中找不到vue.js问题 1.安装插件 打开IDEA的界面如下 步骤:(1)file-->setting-->plugins ​ (2)在搜索框 ...

  2. thymeleaf加载不了js引用_web前端教程之js中的模块化一

    web前端教程之js中的模块化一:我们知道最常见的模块化方案有CommonJS.AMD.CMD.ES6,AMD规范一般用于浏览器,异步的,因为模块加载是异步的,js解释是同步的,所以有时候导致依赖还没 ...

  3. 前端为什么有的接口明明是成功回调却执行了.catch失败回调_Web前端:ES6是干什么的?(下)...

    大家好,我来了!本期为大家带来的Web前端学习知识是"Web前端:ES6是干什么的?(下)",喜欢Web前端的小伙伴,一起看看吧! 主要内容 Promise Generator A ...

  4. variable ‘‘ of type ‘‘ referenced from scope ‘‘, but it is not defined 异常解决方法

    variable '' of type '' referenced from scope '', but it is not defined 异常解决方法 参考文章: (1)variable '' o ...

  5. [Vue warn]: Failed to mount component: template or render function not defined. 错误解决方法

    [Vue warn]: Failed to mount component: template or render function not defined. 错误解决方法 参考文章: (1)[Vue ...

  6. Target runtime Apache Tomcat v6.0 is not defined.错误解决方法

    Target runtime Apache Tomcat v6.0 is not defined.错误解决方法 Eclipse导入工程后工程上显示一个小红叉,但工程里没有文件错误,也没有语法错误,百思 ...

  7. partial is not defined的解决办法

    1.partial is not defined的解决办法 .安装express-partials.  方法一:运行cmd用npm install express-partials  方法二:在pac ...

  8. Vue中:error ‘XXXXX‘ is not defined no-undef解决办法

    Vue中:error 'XXXXX' is not defined no-undef解决办法 语法没错居然报错了 解决方法: 拓展 语法没错居然报错了 解决方法: 在使用vue的时候,使用一个全局变量 ...

  9. Vue中error ‘XXXXX‘ is not defined no-undef解决办法

    Vue中:error 'XXXXX' is not defined no-undef解决办法 语法没错居然报错了 解决方法: 拓展 语法没错居然报错了 解决方法: 在使用vue的时候,使用一个全局变量 ...

最新文章

  1. bootstrap-关闭按钮
  2. 用Kubernetes部署超级账本Fabric的区块链即服务(1)
  3. python报表设计控件_使用Python快速制作可视化报表
  4. [转载]oracle函数listagg的使用说明
  5. 1000道Python题库系列分享21(11道编程题:内置函数专项练习)
  6. Web前端面试指导(十四):如何居中一个元素(正常、绝对定位、浮动元素)?
  7. 数据丢失与重复_面试官:如何保证消息的可靠性传输?如何处理消息丢失的问题?...
  8. FlexDisPlayRoom正在发货「可在线玩弄」
  9. 同构数怎么判断_判断同构数C语言
  10. [Matlab科学计算] 有限元法求二阶常微分方程
  11. DDS(Direct Digital Synthesizer)数字频率合成器
  12. pdfFactory2020最新7许可密钥-激活码版虚拟打印软件 中文特别授权版下载
  13. go-ipfs命令详解之files
  14. 移动端/嵌入式-CV模型-2018:MobelNets-v2【Inverted Residuals(中间胖两头瘦)、Linear Bottlenecks(每个倒残差的最后一个卷积层使用线性激活函数)】
  15. 软考中级 真题 2015年上半年 信息系统管理工程师 应用技术
  16. Flutter自定义Decoration实现特殊的背景框
  17. STC8H8K64U单片机-看门狗配置与讲解
  18. 企业内部即时通讯工具支持内网私有化部署
  19. 微信公众号的常见问题
  20. 书评-《日进3万3》浙师大“包,二,奶”生意火爆,木人管还获得支持?你只有羡慕嫉妒恨

热门文章

  1. 详解随机神经网络结构搜索 (SNAS)
  2. 数字音视频技术:音频中的一些概念(采样率, 位深度, 声道数, Sample/Frame/Packet)
  3. Matlab 接受字符串并转为符号表达式,inline函数,匿名函数形式的方法汇总
  4. 网页直播中推流组件EasyRTM推送RTMP扩展支持HEVC(H265)
  5. windows下安装使用couchdb
  6. linux shell脚本学习xargs命令使用详解
  7. 图像增强——基于OpenCV的图像色彩增强
  8. 计算机工程类高级职称,2019年工程类中高级职称都有哪些专业?
  9. aws java mysql_Lambda本地连接到Aurora MySql - 部署到AWS时超时
  10. tcp 的ack, seq