问题描述:
在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: 13 14 } 15 16 let obj_d = obj_b 17 18 console.log(obj_a === obj_b) // false 19 console.log(obj_b === obj_c) // false 20 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,否则返回 false 23 const isObjectListValueEqual = (list, obj) => { 24 for (let i = 0, len = list.length; i < len; i++) { 25 if (isObjectValueEqual(list[i], obj)) { 26 return true 27 } 28 } 29 return false 30 } 31 32 // 判断一个数组(该数组由对象所组成)中每个对象是否是不重复的(值) 33 // 如果 list 数组中没有重复的对象,则返回 true,否则返回 false 34 const isJudgeObjectListValueSingle = (list) => { 35 let receive = list 36 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 false 41 } 42 } 43 return true 44 }
结论:
1)===主要用于判断对象是否是同一个对象,而不能用来判断两个存储地址不一致的对象在属性上是否完全相等
2)判断存储地址不一致的对象在属性上是否完全相等可以使用如上函数
3)普通变量可以使用 set 集合的方法方便地去重,但是对象变量是不能的(这点可以自己验证)
原文地址:https://www.cnblogs.com/oulae/p/10777117.html
时间: 2024-10-04 15:34:30