Как сравниваются объекты с помощью == или ===?

👨‍💻 Frontend Developer 🟠 Может встретиться 🎚️ Средний
#JavaScript #Объекты #База JS

Краткий ответ

Объекты в JavaScript сравниваются по ссылке, а не по содержимому. Операторы == и === возвращают true только если оба операнда ссылаются на один и тот же объект в памяти. Даже если объекты выглядят одинаково, они не равны, если это разные объекты.


Полный ответ

В JavaScript объекты сравниваются не так, как примитивные значения. Важно понимать, как работает сравнение, чтобы избежать ошибок.

Как работает сравнение объектов

Объекты сравниваются по ссылке, а не по значению:

const obj1 = { name: 'Иван' };
const obj2 = { name: 'Иван' };
console.log(obj1 == obj2); // false
console.log(obj1 === obj2); // false

Почему объекты не равны

Разные объекты в памяти

const obj1 = { a: 1 };
const obj2 = { a: 1 };
// obj1 и obj2 — разные объекты в памяти
console.log(obj1 === obj2); // false

Один и тот же объект

const obj1 = { a: 1 };
const obj2 = obj1; // Одна и та же ссылка
console.log(obj1 === obj2); // true

Простые примеры

Сравнение одинаковых объектов

const user1 = { name: 'Иван', age: 25 };
const user2 = { name: 'Иван', age: 25 };
 
// Даже с одинаковыми данными — не равны
console.log(user1 === user2); // false

Сравнение ссылок

const user = { name: 'Иван' };
const sameUser = user; // Та же ссылка
 
console.log(user === sameUser); // true
console.log(user === { name: 'Иван' }); // false

Особенности == и === с объектами

Оба оператора работают одинаково

const obj1 = { a: 1 };
const obj2 = { a: 1 };
 
// С объектами == и === работают одинаково
console.log(obj1 == obj2); // false
console.log(obj1 === obj2); // false

Сравнение с null и undefined

const obj = { a: 1 };
 
console.log(obj == null); // false
console.log(obj === null); // false
console.log(obj == undefined); // false
console.log(obj === undefined); // false

Когда объекты равны

Только один и тот же объект

const user = { name: 'Иван' };
const admin = user; // Та же ссылка
 
console.log(user === admin); // true
admin.name = 'Петр';
console.log(user.name); // 'Петр' — это один и тот же объект

После присваивания

let obj1 = { a: 1 };
let obj2 = obj1;
 
console.log(obj1 === obj2); // true
obj2 = { a: 1 }; // Новый объект
console.log(obj1 === obj2); // false

Частые ошибки

1. Ожидание равенства по содержимому

// ❌ Думаем, что объекты с одинаковыми данными равны
const obj1 = { name: 'Иван' };
const obj2 = { name: 'Иван' };
if (obj1 === obj2) {
  console.log('Равны'); // Не сработает
}
 
// ✅ Правильное понимание
console.log(obj1 === obj2); // false

2. Сравнение с примитивами

// ❌ Сравнение объекта с примитивом
const obj = { toString() { return 'test'; } };
console.log(obj == 'test'); // true (преобразование)
console.log(obj === 'test'); // false (разные типы)

Простые правила

  1. По ссылке — объекты сравниваются по ссылке, не по содержимому
  2. Один объект — только один и тот же объект равен самому себе
  3. == и === — с объектами работают одинаково
  4. Разные объекты — даже с одинаковыми данными не равны
  5. Ссылка — переменные могут ссылаться на один объект

Понимание сравнения объектов помогает избежать ошибок при работе с данными и условиями в коде.


Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪