每天对自己多问几个为什么,总是有着想象不到的收获。 一个菜鸟小白的成长之路(copyer)
在理解浅比较跟深比较之前,我们需要先回顾一下==
和===
的区别
==
和 ===
的区别
==
代表相同;===
代表严格相同
==
先检查两个操作数据的类型,如果类型相同,就会===
比较;如果不相同,转化为相同的类型,然后再次比较===
先检查类型,如果类型不相同,直接返回false;如果相同,再比较
简单看下
===
的比较几种情况(1)如果类型不同,就一定不相等
(2)如果两个都是数值,并且是同一个值,那么相等;如果其中至少一个是NaN,那么不相等。
(3)如果两个都是字符串,每个位置的字符都一样,那么相等,否则不相等。
(4)如果两个值都是true,或是false,那么相等
(5)如果两个值都引用同一个对象或是函数,那么相等,否则不相等
(6)如果两个值都是null,或是undefined,那么相等
浅比较
钱比较
只是针对于引用类型,也称引用相等
。
===
就是作钱比较,只检查两边是否同一个对象(也就是所谓的地址是否相同)
//返回false
{
a:1} === {
a:1} // false
const m = {
a:1};
const n = {
a:1};
m === n //false
//返回true
const m = {
a:1};
const n = m;
m === n //true
changeValue(params) {
params.a = 2;
return params;
}
const m = {
a:1};
const n = changeValue(m);
m === n //true
m //{a:2}
n //{a:2}
//注意,这种代码一定少写,所以的引用传递,甚至在一些编辑器中会有警告的提示
深比较
深比较
也称原值相等,深比较是指检查两个对象
的所有属性
是否都相等
,深比较
需要以递归的方式遍历两个对象的所有属性,操作比较耗时,深比较
不管这两个对象是不是同一对象的引用。
手动实现一个深比较
function isObject(obj) {
// 判断是否是对象
return typeof obj === 'object' ? true : false
}
function isEqual(obj1, obj2) {
//情况一: 有一个是基本数据类型(甚至两个),那么就看值是否相等
if(!isObject(obj1) || !isObject(obj2)) {
return obj1 === obj2
}
//情况二: 如果两个地址相同,也就是浅比较
if(obj1 === obj2) {
return true
}
//情况三:针对于不同地址的对象
const obj1Keys = Object.keys(obj1);
const obj2Keys = Object.keys(obj2);
//属性名的长度不一样,返回false
if(obj1Keys.length !== obj2Keys.length) {
return false;
}
for(let key in obj1) {
let res = isEqual(obj1[key], obj2[key])
//返回false,说明不满足深比较,就直接返回
if(!res) {
return false
}
}
//条件循环完,返回true
return true
}