В чем разница между значением и идентичностью?
Продвинутые темы
Значение (value) и идентичность (identity) различают: значение — что содержит переменная, идентичность — конкретный объект в памяти. Примитивы сравниваются по значению, объекты — по идентичности (ссылке).
Значение (value)
Содержимое данных. Примитивы равны по значению, если содержат одно и то же:
5 === 5; // true — одинаковое значение
'abc' === 'abc'; // true — одинаковое значениеИдентичность (identity)
Конкретный экземпляр объекта в памяти. Два объекта с одинаковым содержимым — разные идентичности:
{ x: 1 } === { x: 1 }; // false — разные объекты (идентичности)
const o = { x: 1 };
o === o; // true — та же идентичностьКак сравнивается в JS
- Примитивы — по значению (содержимому).
- Объекты — по идентичности (ссылке): равны, только если это один и тот же объект.
const a = { x: 1 };
const b = a; // та же идентичность
const c = { x: 1 }; // другая идентичность, то же значение
a === b; // true (одна идентичность)
a === c; // false (разные идентичности)Практическое значение
- Чтобы сравнить объекты по значению — нужно глубокое сравнение (
lodash.isEqual), т.к.===сравнивает идентичность. - React/иммутабельность используют смену идентичности (новая ссылка) как сигнал изменения.
Коротко для собеседования
Значение — содержимое данных; идентичность — конкретный объект в памяти. Примитивы сравниваются по значению (5 === 5), объекты — по идентичности/ссылке ({} !== {}, даже при одинаковом содержимом). Для сравнения объектов по значению нужно глубокое сравнение; React использует смену идентичности как признак изменения.