Какие типы данных являются ссылочными в JavaScript?
Что проверяют
Понимаете ли вы модель памяти языка, а не помните список. Сам перечень короткий, поэтому интервьюер сразу переходит к последствиям: даёт кусок кода с мутацией объекта внутри функции или со сравнением двух массивов и смотрит, предскажете ли вы результат. Часто следом идёт вопрос про поверхностное и глубокое копирование.
Как отвечать
Начните с границы. Примитивов семь: string, number, bigint, boolean, undefined, symbol и null, они хранятся по значению. Всё остальное объекты, то есть ссылочные типы: объектные литералы, массивы, функции, экземпляры классов, Date, RegExp, Map, Set, WeakMap, WeakSet, Promise, Error, типизированные массивы. Упомяните, что typeof null возвращает "object": это историческая ошибка языка, а не признак ссылочного типа.
Дальше про поведение, ради которого вопрос и задан:
- присваивание: копируется ссылка, не содержимое, поэтому две переменные правят один объект;
- сравнение:
===сравнивает ссылки,{} === {}даётfalse, а[1,2]и[1,2]никогда не равны; - передача в функцию: аргумент всегда копия значения, но для объекта это копия ссылки, поэтому мутация видна снаружи, а переприсваивание параметра нет;
const: запрещает переприсваивание переменной, а не изменение объекта,Object.freezeзамораживает только верхний уровень;- копирование: спред и
Object.assignповерхностные,structuredClone()делает глубокую копию и умеетMap,Set,Dateи циклические ссылки, но не переносит функции и прототипы, аJSON.parse(JSON.stringify(x))теряетundefined, превращает даты в строки и падает на цикле.
Хорошо добавить про сборку мусора: объект живёт, пока на него есть достижимая ссылка, а WeakMap и WeakRef её не удерживают.
Где спотыкаются
Называют массив отдельным типом и не помнят, что typeof [] это "object", а проверяют через Array.isArray.
Делают поверхностную копию, правят вложенный объект и ломают оригинал. В React это выглядит как компонент, который не перерисовался, хотя данные изменились.
Кладут объекты в Set или ключами в Map и ждут дедупликации по содержимому. Уникальность там по ссылке, нужен свой ключ из полей.