Примитивы, ссылки, копирование

В чём разница между примитивами и ссылочными типами?

Примитивы (копируются по значению): string, number, boolean, null, undefined, symbol, bigint

Ссылочные типы (копируются по ссылке): Object, Array, Function, Date, Map, Set

// Примитив
let a = 5;
let b = a;
b = 10;
console.log(a); // 5 — не изменился
 
// Объект
let obj1 = { x: 1 };
let obj2 = obj1;
obj2.x = 99;
console.log(obj1.x); // 99 — изменился!

Что такое shallow copy и deep copy?

Shallow copy — копирует только верхний уровень. Вложенные объекты остаются общими.

const copy = { ...original };
const copy = Object.assign({}, original);
const copy = original.slice(); // для массивов

Deep copy — полная независимая копия на всех уровнях.

const copy = structuredClone(original); // современный способ
const copy = JSON.parse(JSON.stringify(original)); // теряет undefined/Date/Function

structuredClone доступен в современных браузерах и Node.js 17+.

См. также

  • js-objects-async — таблица сериализации при копировании объектов