> Можно ли изменять массивы и объекты, объявленные через 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 рекомендуется создавать новые объекты/массивы вместо мутации существующих.
Пример кода
JAVASCRIPTconst 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 variableconst 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() работает только поверхностно, и вложенные объекты остаются мутабельными. Также встречается непонимание, что переприсваивание свойства объекта - это не то же самое, что переприсваивание переменной.
> Похожие задачи по frontend
Как сравнить массивы аргументов для кеширования в функции memo в JavaScript
В чем разница между Promise.all и Promise.allSettled в JavaScript?
Каков порядок выполнения задач (task) и микротасков (microtask) в JavaScript
В чем разница между Promise.all, Promise.any и Promise.race в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью