PassFront
  1. PassFront
  2. База знаний
  3. Объекты и прототипы

Как правильно сравнивать объекты?

Объекты и прототипы

Объекты нельзя сравнивать через `==`/`===` по содержимому — эти операторы сравнивают ссылки. Для сравнения по значению нужен отдельный подход.

Почему === не работает

{ a: 1 } === { a: 1 }; // false — разные ссылки
const o = { a: 1 };
o === o;               // true — та же ссылка

Способы сравнения по значению

1. JSON.stringify (простые случаи)

JSON.stringify(a) === JSON.stringify(b);

Минусы: зависит от порядка ключей, не работает с функциями, undefined, циклами, Map/Set; NaN/Infinity → null.

2. Рекурсивное глубокое сравнение

Обойти ключи и сравнить значения рекурсивно (или взять lodash.isEqual).

import isEqual from 'lodash/isEqual';
isEqual(a, b); // true при равенстве содержимого

3. Поверхностное сравнение (shallow)

Сравнить ключи верхнего уровня — быстро, используется в React (shallowEqual), но не учитывает вложенность.

Как выбирать

  • Плоские объекты, производительность → shallow compare.
  • Глубокая структура → lodash.isEqual / рекурсия.
  • Быстрый хак для простых данных → JSON.stringify (с оговорками).

Коротко для собеседования

=== сравнивает объекты по ссылке, не по содержимому. Для сравнения по значению: JSON.stringify (с ограничениями порядка ключей и типов), lodash.isEqual/рекурсия для глубокого, shallow-сравнение ключей для плоского.

Другие вопросы раздела