Почему нельзя сравнивать объекты через == и ===

Ответ

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

const obj1 = { a: 1 };
const obj2 = { a: 1 };
const obj3 = obj1;

console.log(obj1 == obj2);  // false
console.log(obj1 === obj2); // false
console.log(obj1 === obj3); // true (та же ссылка)

Для сравнения объектов по содержимому нужно использовать глубокое сравнение, например, с помощью JSON.stringify() (если нет функций/цикличных ссылок) или библиотек вроде Lodash (_.isEqual()).

Ответ 18+ 🔞

А, ну это классика, блядь! Каждый второй на этом подгорает, как спичка, ёпта.

Смотри, в JavaScript объекты — они как близнецы, но с разными паспортами. Можно двух человек найти, оба лысые, в очках и с пивным пузом, но это же не значит, что это один и тот же мудак, правда? Так и тут.

Операторы == и === — они не вникают в твои внутренние переживания и не сравнивают, что у тебя в душе (то есть в свойствах). Им похуй. Они смотрят только на одну вещь: это один и тот же кусок памяти или нет? Одна и та же квартира или просто две одинаковые однушки в разных районах?

const obj1 = { a: 1 }; // Построил однушку в Отрадном
const obj2 = { a: 1 }; // Построил такую же однушку, но в Бутово, сука
const obj3 = obj1; // Даю тебе ключи от своей квартиры в Отрадном

console.log(obj1 == obj2);  // false - Районы-то разные, блядь!
console.log(obj1 === obj2); // false - Да я же говорю, это разные дома!
console.log(obj1 === obj3); // true - А вот это уже ключи от моей же хаты, welcome!

Вот obj3 — это не новый объект, это просто новая табличка «Герасим» на двери всё той же самой конуры. Поэтому === и говорит: «Да, братан, это оно».

А теперь главный пиздец: как сравнить эти две однушки по содержимому, если район похуй? Ну, есть способы, но они с подвохом, как всегда.

  1. JSON.stringify() — это как сфотографировать квартиру, а потом сравнить фотки. Работает, если внутри только простые вещи (строки, числа, другие объекты и массивы). Но если у тебя там висит портрет деда с функцией-пугачом, или зеркало, отражающее само себя (циклическая ссылка), то всё, пизда методу. Фото не получится.

    JSON.stringify(obj1) === JSON.stringify(obj2); // true, но это опасный путь, ёпта
  2. Библиотеки, типа Lodash и её _.isEqual() — это уже профессиональные оценщики. Они заходят в обе квартиры, проверяют каждый хуй, каждую пылинку, заглядывают в холодильник и под кровать. Глубокое сравнение, ебать. Вот это надёжно.

Так что запомни: === для объектов — это проверка на один и тот же адрес в памяти, а не на одинаковый интерьер. Не хочешь париться — тащи Lodash. А то самому писать глубокое сравнение... это тот ещё геморрой, волнение ебать, терпения ноль ебать.