JS 判断两个对象是否相等
在 JavaScript 中,当我们需要比较两个对象是否相等时,通常会用到 ===
运算符。但是,由于对象在 JavaScript 中是引用类型,所以直接使用 ===
运算符比较两个对象时,实际上比较的是它们的引用地址,而不是它们的值。因此,我们需要一种方法来判断两个对象的值是否相等。
深度比较两个对象
为了比较两个对象的值是否相等,我们可以编写一个函数,实现对两个对象的递归比较。这种比较方式被称为“深度比较”。
function deepEqual(obj1, obj2) {
// 判断类型是否相同
if (typeof obj1 !== typeof obj2) {
return false;
}
// 判断是否为对象或数组
if (typeof obj1 === 'object' && obj1 !== null && typeof obj2 === 'object' && obj2 !== null) {
// 获取两个对象的属性名
let keys1 = Object.keys(obj1);
let keys2 = Object.keys(obj2);
// 判断属性数量是否相同
if (keys1.length !== keys2.length) {
return false;
}
// 递归比较属性值
for (let key of keys1) {
if (!deepEqual(obj1[key], obj2[key])) {
return false;
}
}
return true;
} else {
// 直接比较基本类型值
return obj1 === obj2;
}
}
上面的函数 deepEqual
接受两个参数 obj1
和 obj2
,分别代表要比较的两个对象。函数首先判断两个对象的类型是否相同,然后再递归进行深度比较。如果两个对象的所有属性值都相等,则返回 true
;否则返回 false
。
示例
接下来,我们通过一个示例来演示如何使用 deepEqual
函数比较两个对象是否相等。
let obj1 = {
name: 'Alice',
age: 30,
address: {
city: 'New York',
zip: 10001
},
hobbies: ['reading', 'traveling']
};
let obj2 = {
name: 'Alice',
age: 30,
address: {
city: 'New York',
zip: 10001
},
hobbies: ['reading', 'traveling']
};
let obj3 = {
name: 'Bob',
age: 25,
address: {
city: 'Los Angeles',
zip: 90001
},
hobbies: ['music', 'sports']
};
console.log(deepEqual(obj1, obj2)); // true
console.log(deepEqual(obj1, obj3)); // false
在上面的示例中,我们定义了三个对象 obj1
、obj2
和 obj3
,分别代表不同的个人信息。通过调用 deepEqual
函数,我们将 obj1
和 obj2
进行比较,可以看到它们的值是相等的,返回 true
;而 obj1
和 obj3
的值是不相等的,返回 false
。
通过深度比较两个对象,我们可以更准确地判断它们是否相等,而不仅仅是比较它们的引用地址。这在实际开发中的需求中是非常有用的。因此,建议在需要判断两个对象是否相等时,使用deepEqual
函数进行比较。