> Можно ли изменять массивы и объекты, объявленные через const в JavaScript? (JavaScript)

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

Компании: YADRO, Домклик, IT-One

Стек: JavaScript

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

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

Да, можно. const в JavaScript запрещает переприсваивание переменной, но не делает сам объект или массив неизменяемым. Содержимое объектов и массивов (свойства, элементы) можно изменять, добавлять или удалять. const гарантирует только, что ссылка на объект или массив останется той же самой.

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

const блокирует изменение самой ссылки, хранящейся в переменной. Для примитивных типов (числа, строки, булевы значения) это означает полную неизменяемость - значение нельзя изменить, можно только переприсвоить переменную, что запрещено. Для ссылочных типов (объекты, массивы, функции) переменная хранит адрес в памяти. const фиксирует этот адрес, но не защищает данные по этому адресу. Поэтому операции, не меняющие ссылку (например, arr.push(), obj.key = value), разрешены. Чтобы сделать объект или массив действительно неизменяемым, нужно использовать Object.freeze() или библиотеки вроде Immutable.js.

На практике

Разработчики часто используют const для объявления массивов и объектов, которые не должны быть перезаписаны целиком. Это помогает избежать случайного переприсваивания и делает код более предсказуемым. При этом мутации содержимого остаются возможными, что может приводить к багам, если не контролировать изменения. Для иммутабельного подхода в React или Redux рекомендуется создавать новые объекты/массивы вместо мутации существующих.

Пример кода

JAVASCRIPT
const arr = [1, 2, 3];
arr.push(4); // разрешено - arr теперь [1, 2, 3, 4]
arr[0] = 10; // разрешено - arr теперь [10, 2, 3, 4]
arr = [5, 6]; // TypeError: Assignment to constant variable
const obj = { name: 'Alice' };
obj.age = 30; // разрешено - obj теперь { name: 'Alice', age: 30 }
delete obj.name; // разрешено - obj теперь { age: 30 }
obj = {}; // TypeError: Assignment to constant variable

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

Начни с чёткого утверждения, что const не делает данные неизменяемыми. Объясни разницу между ссылкой и значением. Приведи примеры мутаций, которые разрешены, и покажи, что попытка переприсвоить переменную вызовет ошибку. Упомяни Object.freeze() как способ сделать объект действительно константным, но отметь его ограничения (поверхностное замораживание). Если контекст позволяет, расскажи о практических последствиях для иммутабельности в React или Redux.

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

Интервьюер оценивает понимание ссылочной модели JavaScript, разницу между const, let и var, а также осознание того, что const не гарантирует неизменяемость данных. Проверяется способность объяснить, почему мутации возможны, и знание инструментов для создания действительно неизменяемых структур. Это базовый, но важный концепт для работы с состоянием в современных фреймворках.

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

Кандидаты часто путают const с полной неизменяемостью и утверждают, что объекты и массивы нельзя изменять. Другая ошибка - считать, что const работает одинаково для примитивов и ссылочных типов. Иногда забывают, что Object.freeze() работает только поверхностно, и вложенные объекты остаются мутабельными. Также встречается непонимание, что переприсваивание свойства объекта - это не то же самое, что переприсваивание переменной.

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

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