Равенство объектов в 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 для проверки значений объекта:

  1. "Подчеркивать"
  2. Лодаш
  3. Узел 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