Перейти к содержимому

Primitives vs Objects

В одной фразе: примитивы хранятся by value, объекты — by reference. На собесе проверяют понимание, почему a = b; b.x = 1 меняет и a, а ещё почему new String(“x”) !== “x” и что такое autoboxing.

let a = { n: 1 };
let b = a; // b получает копию ссылки, а не сам объект
b.n = 2;
console.log(a.n); // 2 — оба указателя ведут в одно место в heap
let x = 5;
let y = x; // копия значения
y = 99;
console.log(x); // 5 — x не изменился
// Сравнение объектов — по ссылке, не по содержимому
console.log({} === {}); // false — два разных объекта в памяти
console.log([] === []); // false — та же история
const A = { v: 1 };
const B = A;
console.log(A === B); // true — одна и та же ссылка
// Autoboxing: движок временно оборачивает примитив в объект
'hello'.toUpperCase(); // OK: движок создаёт new String('hello'), вызывает метод, уничтожает
(42).toFixed(2); // OK: new Number(42) -> метод -> уничтожен
// Явный wrapper-объект != примитив
const s = new String('hi');
typeof s; // 'object' — не 'string'!
s === 'hi'; // false
// null/undefined wrapper не существует — поэтому null.foo → TypeError

Итог: Семь примитивов (string, number, boolean, null, undefined, bigint, symbol) — immutable, копируются по значению. Объекты, массивы, функции — по ссылке.