在JavaScript中,对象之间的比较通常通过引用进行。当你使用
==
运算符比较两个对象时,它会检查它们是否引用了同一个内存地址,而不是逐个比较对象的属性。
上图可见,obj1
和{}
是两个不同的对象,尽管它们具有相同的结构(都是空对象)。因此,使用==
进行比较将返回false,因为它们并不是同一个内存中的对象。
进行对象递归对比
函数如下
function deepEqual(obj1, obj2) {
// 检查类型和可枚举属性数量
if (typeof obj1 !== typeof obj2 || Object.keys(obj1).length !== Object.keys(obj2).length) {
return false;
}
// 逐个比较属性值
for (var prop in obj1) {
if (obj1.hasOwnProperty(prop)) {
if (typeof obj1[prop] === 'object') {
// 递归比较子对象
if (!deepEqual(obj1[prop], obj2[prop])) {
return false;
}
} else if (obj1[prop] !== obj2[prop]) {
return false;
}
}
}
return true;
}
var obj1 = { name: 'John', age: 30 };
var obj2 = { name: 'John', age: 30 };
var obj3 = { name: 'Jane', age: 25 };
console.log(deepEqual(obj1, obj2)); // 输出 true
console.log(deepEqual(obj1, obj3)); // 输出 false