Этот вопрос проверяет, понимаете ли вы разницу между значениями “по значению” и “по ссылке”, а также как это влияет на сравнение и изменения данных.
Примитивы (например, number, string, boolean) хранят “само значение”, и при присваивании копируется значение. Непримитивы (объекты, массивы, функции) хранятся как ссылка на объект в памяти, и при присваивании копируется ссылка. Поэтому изменения объекта через одну переменную видны в другой. Также сравнение объектов чаще сравнивает ссылки, а не содержимое.
Примитивный тип — значение, которое не является объектом и ведёт себя как “копируемое значение”.
Непримитивный тип — объект (включая массивы и функции), который передаётся как “ссылка на один и тот же объект”.
Примитивы:
string
number
boolean
null
undefined
bigint
symbol
Непримитивы:
object (в т.ч. {}, [], new Date(), Map, Set)
function (технически тоже объект)
Перед перечислением важно запомнить идею: у примитива “нет внутреннего состояния, на которое можно сослаться”, а у объекта есть.
Примитивы копируются “как есть”
let a = 10;
let b = a;
b = 20;
console.log(a); // 10
console.log(b); // 20
Объекты копируются как ссылка на один и тот же объект
const obj1 = { x: 1 };
const obj2 = obj1;
obj2.x = 2;
console.log(obj1.x); // 2
console.log(obj2.x); // 2
Примитивы сравниваются по значению:
5 === 5 → true
Объекты сравниваются по ссылке:
const a = { x: 1 };
const b = { x: 1 };
const c = a;
console.log(a === b); // false (разные объекты)
console.log(a === c); // true (одна и та же ссылка)
Если вы хотите “безопасно менять данные”, объекты нужно копировать (например, через spread или structuredClone).
Если вы храните состояние в UI (React/Redux), важно помнить: изменение вложенного объекта без создания новой ссылки часто ломает корректное обновление.