> Какие типы данных являются ссылочными в JavaScript? (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Kodix, ООО Снэп АйТи

Стек: JavaScript

> Пример ответа

Короткий ответ

В JavaScript ссылочными типами данных являются объекты (Object), массивы (Array), функции (Function), а также специализированные объекты: Date, RegExp, Map, Set, WeakMap, WeakSet. Примитивные типы (string, number, boolean, null, undefined, symbol, bigint) передаются по значению. Ссылочные типы хранятся в куче и передаются по ссылке, что означает, что переменная содержит не сам объект, а адрес в памяти.

Подробное объяснение

Ссылочные типы в JavaScript - это те, которые не являются примитивами. Они представляют собой сложные структуры данных, хранящиеся в динамической памяти (heap). Ключевое отличие от примитивов: при присваивании или передаче в функцию копируется ссылка на объект, а не его значение. Это означает, что две переменные могут указывать на один и тот же объект, и изменения через одну переменную отразятся на другой.

Основные ссылочные типы:

  • Object: базовый тип для всех ссылочных структур
  • Array: упорядоченный список элементов
  • Function: вызываемый объект
  • Date: работа с датами и временем
  • RegExp: регулярные выражения
  • Map, Set, WeakMap, WeakSet: коллекции из ES6
  • Error и его подтипы (TypeError, ReferenceError и др.)

Важно: typeof null возвращает "object", но null - это примитив, а не ссылочный тип. Это известная историческая ошибка JavaScript.

На практике

Для senior-разработчика понимание ссылочных типов критично при:

  • Оптимизации производительности: избегание случайных мутаций объектов
  • Работе с иммутабельностью в React или Redux
  • Отладке багов, связанных с неожиданным изменением данных
  • Проектировании архитектуры: выбор между передачей по ссылке и созданием копий

Глубокое копирование объектов - частая задача: structuredClone(), JSON.parse(JSON.stringify(obj)) или библиотеки вроде lodash.cloneDeep. Поверхностное копирование через spread-оператор или Object.assign() копирует только первый уровень.

Пример кода

JAVASCRIPT
// Передача по ссылке
const obj1 = { value: 10 };
const obj2 = obj1;
obj2.value = 20;
console.log(obj1.value); // 20 - obj1 изменился
// Примитивы передаются по значению
let a = 5;
let b = a;
b = 10;
console.log(a); // 5 - a не изменился
// Сравнение объектов
console.log({} === {}); // false - разные ссылки
console.log([] === []); // false
// Глубокое копирование
const original = { nested: { key: 'value' } };
const shallowCopy = { ...original };
const deepCopy = structuredClone(original);
shallowCopy.nested.key = 'changed';
console.log(original.nested.key); // 'changed' - мутация
deepCopy.nested.key = 'new';
console.log(original.nested.key); // 'changed' - без мутации

Как отвечать на собеседовании

Начни с чёткого разделения примитивов и ссылочных типов. Перечисли основные ссылочные типы, упомяни null как исключение. Объясни механизм передачи по ссылке и приведи практический пример с мутацией. Для senior-уровня добавь про оптимизацию, иммутабельность и способы копирования. Покажи понимание, как это влияет на сравнение объектов и работу с коллекциями.

Что проверяет интервьюер

  • Понимание фундаментального различия между примитивами и объектами
  • Знание механизма работы памяти в JS (stack vs heap)
  • Умение предсказывать поведение кода при мутациях
  • Осведомлённость о подводных камнях (null, сравнение объектов)
  • Практический опыт с копированием и иммутабельностью

Типичные ошибки

  • Утверждение, что null - ссылочный тип (хотя typeof null - "object", это примитив)
  • Путаница между поверхностным и глубоким копированием
  • Игнорирование того, что функции - тоже объекты и передаются по ссылке
  • Непонимание, что примитивы (кроме null/undefined) имеют объектные обёртки (new String()), но это не меняет их природы
  • Ожидание, что оператор === сравнивает содержимое объектов

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью