Проверяет понимание ссылочной природы объектов в JavaScript и причин, по которым сравнение объектов по значению не работает напрямую.
В JavaScript примитивные типы (числа, строки, булевы значения) сравниваются по значению: если два числа равны, они считаются одинаковыми. Однако объекты (включая массивы, функции, даты) являются ссылочными типами. Переменная, которой присвоен объект, хранит не сам объект, а ссылку на область памяти, где он находится. Поэтому при сравнении двух объектов операторы == и === проверяют, указывают ли обе переменные на один и тот же объект в памяти, а не на одинаковое содержимое.
const obj1 = { name: 'Alice', age: 30 };
const obj2 = { name: 'Alice', age: 30 };
console.log(obj1 === obj2); // false, потому что ссылки разные
const obj3 = obj1;
console.log(obj1 === obj3); // true, потому что obj3 указывает на тот же объектДаже если поля объектов полностью совпадают, они считаются разными, так как это два независимых экземпляра в памяти.
Для сравнения по значению нужно вручную проверять каждое поле или использовать библиотеки, например lodash.isEqual. В современном JavaScript можно написать функцию глубокого сравнения, которая рекурсивно обходит свойства объектов.
function deepEqual(a, b) {
if (a === b) return true;
if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;
const keysA = Object.keys(a);
const keysB = Object.keys(b);
if (keysA.length !== keysB.length) return false;
for (let key of keysA) {
if (!keysB.includes(key) || !deepEqual(a[key], b[key])) return false;
}
return true;
}
console.log(deepEqual(obj1, obj2)); // trueПонимание ссылочного сравнения важно при работе с состоянием в React (например, при сравнении props или state), при кэшировании, при проверке изменений объектов, а также при написании тестов, где нужно сравнивать ожидаемые и фактические объекты.
Итог: объекты сравниваются по ссылке, поэтому для сравнения по значению используйте ручное сравнение полей или библиотеки глубокого сравнения. Это критично для корректной работы приложений, где часто приходится проверять равенство сложных структур данных.