在理解浅比较跟深比较之前,我们需要先回顾一下=====的区别

=====的区别

==代表相同===代表严格相同

  • ==先检查两个操作数据的类型,如果类型相同,就会===比较;如果不相同,转化为相同的类型,然后再次比较
  • ===先检查类型,如果类型不相同,直接返回false;如果相同,再比较

简单看下===的比较几种情况

(1)如果类型不同,就一定不相等

(2)如果两个都是数值,并且是同一个值,那么相等;如果其中至少一个是NaN,那么不相等。

(3)如果两个都是字符串,每个位置的字符都一样,那么相等,否则不相等。

(4)如果两个值都是true,或是false,那么相等

(5)如果两个值都引用同一个对象或是函数,那么相等,否则不相等

(6)如果两个值都是null,或是undefined,那么相等

浅比较

钱比较只是针对于引用类型,也称引用相等

=== 就是作钱比较,只检查两边是否同一个对象(也就是所谓的地址是否相同)

 1//返回false
 2{a:1} === {a:1} // false
 3
 4const m = {a:1};
 5const n = {a:1};
 6m === n //false
 7
 8//返回true
 9const m = {a:1};
10const n = m;
11m === n //true
12
13changeValue(params) {
14  params.a = 2;
15  return params;
16}
17const m = {a:1};
18const n = changeValue(m);
19m === n //true
20m //{a:2}
21n //{a:2}
22//注意,这种代码一定少写,所以的引用传递,甚至在一些编辑器中会有警告的提示

深比较

深比较也称原值相等,深比较是指检查两个对象所有属性是否都相等,深比较需要以递归的方式遍历两个对象的所有属性,操作比较耗时,深比较不管这两个对象是不是同一对象的引用。

手动实现一个深比较

 1function isObject(obj) {   // 判断是否是对象
 2    return typeof obj === 'object' ? true : false
 3}
 4
 5function isEqual(obj1, obj2) {
 6    //情况一: 有一个是基本数据类型(甚至两个),那么就看值是否相等
 7    if(!isObject(obj1) || !isObject(obj2)) {
 8        return obj1 === obj2
 9    }
10    //情况二: 如果两个地址相同,也就是浅比较
11    if(obj1 === obj2) {
12        return true
13    }
14    //情况三:针对于不同地址的对象
15    const obj1Keys = Object.keys(obj1);
16    const obj2Keys = Object.keys(obj2);
17    //属性名的长度不一样,返回false
18    if(obj1Keys.length !== obj2Keys.length) {
19        return false;
20    }
21    for(let key in obj1) {
22        let res = isEqual(obj1[key], obj2[key])
23        //返回false,说明不满足深比较,就直接返回
24        if(!res) {
25            return false
26        }
27    }
28    //条件循环完,返回true
29    return true
30}
个人笔记记录 2021 ~ 2025