理解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
}

猜你喜欢

转载自blog.csdn.net/James_xyf/article/details/119941880