Как правильно сравнивать объекты?
Объекты и прототипы
Объекты нельзя сравнивать через `==`/`===` по содержимому — эти операторы сравнивают ссылки. Для сравнения по значению нужен отдельный подход.
Почему === не работает
{ 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-сравнение ключей для плоского.