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, копируются по значению. Объекты, массивы, функции — по ссылке.