Равенство объектов в 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
относятся к одному и тому же экземпляру памяти и, следовательно, возвращают истину.
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
для проверки значений объекта:
- "Подчеркивать"
- Лодаш
- Узел isDeepStrictEqual (объект1, объект2)
let name = { firstName: "suprabha", lastName: "supi" }
let fullName = { firstName: "suprabha", lastName: "supi" }
console.log(_.isEqual(name, fullName)); // true
Резюме ⅀
В объекте, если вы выполняете проверку экземпляра для двух объектов, вы можете использовать ==
, ===
и Object.is()
.
Однако, если вы хотите проверить два значения объекта, вам нужно написать свою собственную логику, чтобы сделать это.
Спасибо, что прочитали статью ❤️
🌟 Twitter | 📚 Электронные книги | 🌟 Instagram