在理解浅比较跟深比较之前,我们需要先回顾一下==
和===
的区别
==
和 ===
的区别
==
代表相同;===
代表严格相同
==
先检查两个操作数据的类型,如果类型相同,就会===
比较;如果不相同,转化为相同的类型,然后再次比较===
先检查类型,如果类型不相同,直接返回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