function deepEqual(a, b) {
// 如果 a 和 b 指向同一块内存,则它们必然相等,直接返回 true
if (a === b) {
return true;
}
// 如果 a 和 b 其中有一个为 null 或 不是对象,则它们必然不相等,直接返回 false
if (typeof a !== "object" || a === null || typeof b !== "object" || b === null) {
return false;
}
// 获取对象 a 和 b 的属性名数组
const keysA = Object.keys(a);
const keysB = Object.keys(b);
// 如果属性名数组的长度不同,则 a 和 b 不相等,直接返回 false
if (keysA.length !== keysB.length) {
return false;
}
// 遍历对象 a 的所有属性,逐个比较它们是否相等
for (const key of keysA) {
// 如果对象 b 中不存在当前属性,则 a 和 b 不相等,直接返回 false
if (!keysB.includes(key)) {
return false;
}
// 递归比较当前属性的值是否相等
if (!deepEqual(a[key], b[key])) {
return false;
}
}
// 如果所有属性都相等,则 a 和 b 相等,返回 true
return true;
}
// 测试用例
const a = {
name: "Tom",
age: 18,
info: {
gender: "male",
address: {
province: "Guangdong",
city: "Shenzhen",
},
},
};
const b = {
name: "Tom",
age: 18,
info: {
gender: "male",
address: {
province: "Guangdong",
city: "Shenzhen",
},
},
};
const c = {
name: "Jerry",
age: 18,
info: {
gender: "male",
address: {
province: "Guangdong",
city: "Shenzhen",
},
},
};
console.log(deepEqual(a, b)); // true
console.log(deepEqual(a, c)); // false
console