PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые темы

В чем разница между значением и идентичностью?

Продвинутые темы

Значение (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 использует смену идентичности как признак изменения.

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