JavaScript中对象的比较

Posted oulae

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript中对象的比较相关的知识,希望对你有一定的参考价值。

问题描述:  

  在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 集合的方法方便地去重,但是对象变量是不能的(这点可以自己验证)

  

以上是关于JavaScript中对象的比较的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段12——JavaScript的Promise对象

VSCode自定义代码片段12——JavaScript的Promise对象

VSCode自定义代码片段——JS中的面向对象编程

VSCode自定义代码片段9——JS中的面向对象编程

从 TypeScript 类型定义或 GraphQL 片段定义生成 JavaScript 空对象

代码片段使用复杂的 JavaScript 在 UIWebView 中插入 HTML?