博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript中对象的比较
阅读量:6834 次
发布时间:2019-06-26

本文共 2243 字,大约阅读时间需要 7 分钟。

问题描述:  

  在JavaScript中,数值的比较是比较简单的,使用相等(==)和全等(===)符号基本上可以解决大多数非对象的比较;但是相等(==)和全等(===)符号在对象 object 的比较上,就不能满足所有的要求了,如下面的代码:

1 let obj_a = { 2 name: "jack", 3     old: 12 4 } 5  6 let obj_b = { 7     name: "lucy", 8     old: 13 9 }10 11 let obj_c = {12     name: "lucy",13     old: 1314 }15 16 let obj_d = obj_b17 18 console.log(obj_a === obj_b) // false19 console.log(obj_b === obj_c) // false20 console.log(obj_b === obj_d) // true

  上面代码中 obj_b 和 obj_c 是不等的,但是和 obj_d 是相等的,这是因为全等符号 === 在比较对象的时候,比较的是对象的地址,换句话来说:全等符号判断的是两个对象是否是一个对象,而不能判断两个对象是否数值相等,事实上,在大多数情况下,使用全等符号去判断两个对象返回的均是 false

解决方法:

  那如果需要判断两个对象在字面意义上是否相等,该才去什么样的操作?答案是遍历两个对象,然后在一一比较 key-value 对;为了方便使用,可以将比较的方法抽象成为下面的函数:

1 // 判断对象相等(数值表现)的函数 2 // 如果 a, b相等,则返回 true,否则返回 false 3 const isObjectValueEqual = (a, b) => { 4     // Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组 5     // 换句话来说 Object.getOwnPropertyNames()方法返回的是对象所有 key 组成的数组 list 6     var aProps = Object.getOwnPropertyNames(a); 7     var bProps = Object.getOwnPropertyNames(b); 8     if (aProps.length != bProps.length) { 9         return false;10     }11 12     for (var i = 0; i < aProps.length; i++) {13         var propName = aProps[i];14         if (a[propName] !== b[propName]) {15             return false;16         }17     }18     return true;19 }20 21 // 判断一个对象是否存在于数组(该数组由对象所组成)中的函数22 // 如果 obj 对象存在于 list 数组中,则返回 true,否则返回 false23 const isObjectListValueEqual = (list, obj) => {24     for (let i = 0, len = list.length; i < len; i++) {25         if (isObjectValueEqual(list[i], obj)) {26             return true27         }28     }29     return false30 }31 32 // 判断一个数组(该数组由对象所组成)中每个对象是否是不重复的(值)33 // 如果 list 数组中没有重复的对象,则返回 true,否则返回 false34 const isJudgeObjectListValueSingle = (list) => {35     let receive = list36     for (let i = 0, len = receive.length; i < len; i++) {37         let temp = receive[i]38         let aim = receive.slice(i + 1, len)39         if (isObjectListValueEqual(aim, temp)) {40             return false41         }42     }43     return true44 }

 

结论:

  1)===主要用于判断对象是否是同一个对象,而不能用来判断两个存储地址不一致的对象在属性上是否完全相等

  2)判断存储地址不一致的对象在属性上是否完全相等可以使用如上函数

  3)普通变量可以使用 set 集合的方法方便地去重,但是对象变量是不能的(这点可以自己验证)

  

转载于:https://www.cnblogs.com/oulae/p/10777117.html

你可能感兴趣的文章
VMware Workstation 安装Red Hat 遇到的问题
查看>>
什么是javascript(一)
查看>>
JAVA入门到精通-第22/23讲-容器、集合类
查看>>
励志写一篇有味道的博文------json
查看>>
oracle赋权
查看>>
c异或加密与解密
查看>>
【转载】ESFramework 平台下可复用的Tcp通信层实现
查看>>
python lib
查看>>
分布式学习资料-专著列表
查看>>
9.配置postfix空客户端
查看>>
计数排序详解以及java实现
查看>>
HTML5介绍
查看>>
图片的title属性和alt属性的区别
查看>>
iOS社会化分享(干货)
查看>>
第八章实验报告
查看>>
使用 gzexe 快速加密解密文件内容
查看>>
java jvm学习笔记十(策略和保护域)
查看>>
Linux(CentOS)挂载移动硬盘
查看>>
JaveWeb 公司项目(7)----- 通过JS动态生成DIV
查看>>
python_控制台输出带颜色的文字方法
查看>>