理解JS中的深比较跟浅比较

每天对自己多问几个为什么,总是有着想象不到的收获。 一个菜鸟小白的成长之路(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
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值