JavaScript中,如何判断俩个对象相等

160 阅读2分钟

前言:如何判断俩个对象相等,且对象中包含对象

判断两个对象是否相等在JavaScript中是一个比较复杂的问题,因为对象是引用类型,直接使用=====比较两个对象时,比较的是它们的内存地址,而非它们的内容。要判断两个对象的内容是否相等,你需要比较它们的结构和每个属性的值。

const obj1 = {
    name: '小米',
    age:12
}
const obj2 = {
    name: '小米',
    age:12
}
console.log(obj1 === obj2) /false

它们的内存地址不同所以是false

const obj1 = {
    name: '小米',
    age:12
}
const obj2 = {
    name: '小米',
    age:12
}
const obj3 = obj1
console.log(obj1 === obj3) /true 

浅拷贝,指向同一内存,所以是true

以下是常用方法来判断俩个对象是否相等

  1. 手动比较每个属性
function isObjectEqual(obj1, obj2){
    //获取自己属性的name, 不包含原型对象的
    const props1 = Object.getOwnPropertyNames(obj1);
    const props2 = Object.getOwnPropertyNames(obj2);
    if(props1.length !== props2.length){
        return false;
    }
    
    //再检查每个属性的值是否相等
    for(let prop of props1){
        const val1 = obj1[prop]
        const val2 = obj2[prop]
        //如果值也是对象,需要递归处理
        const areObjects = isObject(val1) && isObject(val2);
        //总结不想等的情况
        //1.都是对象,递归后的值不相等
        //2.都不是对象,或者其中一个不是对象,那么它们的值不相等
        if(areObjects && !isObjectEqual(val1, val2) || !areObjects && val1 !== val2){
            return false
        }
    }
    return true
    
}

function isObject(obj){
    return obj != null && typeof obj === 'object';
}

const obj1 = {
    name: '小米',
    father:{
        name:'小妹'
    }
}
const obj2 = {
    name: '小米',
    father:{
        name:'小妹'
    }
}

console.log(isObjectEqual(obj1, obj2)) /  true

2.使用 JSON.stringify

但要注意,因为JSON.stringify会根据属性的添加顺序生成字符串,所以即使两个对象的内容完全相同,但属性的顺序不同,也会被认为是不等的。此外,某些JavaScript环境中的对象可能包含不能转换为JSON字符串的属性,如函数或循环引用,这种情况下此方法会失败。

function isObjectEqual(obj1, obj2) { 
    return JSON.stringify(obj1) === JSON.stringify(obj2); 
}

3.使用第三方库

比如Lodash的isEqual方法,它可以深度比较两个对象的值,而且处理了各种边缘情况,是一个非常强大且简便的方法。