JavaScript 中的对象相等性
比较数字或字符串很容易,但你试过比较两个对象吗?🤔
即使两个对象具有相同的键值对,也会返回 false。
例子:
let name = {
firstName: "suprabha",
lastName: "supi"
}
let fullName = {
firstName: "suprabha",
lastName: "supi"
}
console.log(name === name) // true
console.log(name === fullName) // false
console.log(name == fullName) // false
console.log(Object.is(name, fullName)) // false
console.log(Object.is(name, name)) // true
如上例所示,两者name完全相同fullName。然而,这两个对象与==或都不相等===。
在进行对象相等性判断时,可以检查两件事:
1️⃣ 对象具有相同的实例
2️⃣ 对象具有相同的值
1️⃣ 对象具有相同的实例
JavaScript 有两种方法来匹配值。
- 对于原始类型(字符串、数字),它按值进行比较。
- 对于非原始类型(对象、数组、日期),它通过引用进行比较。
“通过参考标准进行比较”是什么意思?
按引用比较是指对象指向内存中的同一位置。
例子:
let name = {
firstName: "suprabha",
lastName: "supi"
}
let fullName = {
firstName: "suprabha",
lastName: "supi"
}
let copyName = fullName
console.log(name === fullName) // false
console.log(copyName == fullName) // true
这里,copyName它们fullName指的是同一内存实例,因此返回 true。
2️⃣ 对象具有相同的值
要检查实例,可以使用===相等性判断,但要匹配值,则需要更多步骤😂
let name = {
firstName: "suprabha",
lastName: "supi"
}
let fullName = {
firstName: "suprabha",
lastName: "supi"
}
function isEqual(obj1, obj2) {
var props1 = Object.getOwnPropertyNames(obj1);
var props2 = Object.getOwnPropertyNames(obj2);
if (props1.length != props2.length) {
return false;
}
for (var i = 0; i < props1.length; i++) {
let val1 = obj1[props1[i]];
let val2 = obj2[props1[i]];
let isObjects = isObject(val1) && isObject(val2);
if (isObjects && !isEqual(val1, val2) || !isObjects && val1 !== val2) {
return false;
}
}
return true;
}
function isObject(object) {
return object != null && typeof object === 'object';
}
console.log(isEqual(name, fullName)); // true
有一些插件可以帮助您应对上述情况,您可以简单地使用这些插件_.isEqual来检查对象值:
let name = {
firstName: "suprabha",
lastName: "supi"
}
let fullName = {
firstName: "suprabha",
lastName: "supi"
}
console.log(_.isEqual(name, fullName)); // true
摘要⅀
在对象中,如果你要检查两个对象的实例,那么你可以使用==,===和Object.is()。
但是,如果您想检查两个对象的值是否相同,则需要自己编写逻辑来实现。
感谢阅读本文❤️
