> В чем разница между var, const и let в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Иннотех, YADRO, циан, ООО Премиум ИТ Солюшен, EvApps, РСХБ, Домклик, IT-One, Rutube, Сфера, Сбер, TYMY, 1221 Systems, Globaldrive, Evercode, Purrweb
Стек: JavaScript
> Пример ответа
Короткий ответ
var имеет функциональную область видимости и всплытие (hoisting) с инициализацией undefined, допускает повторное объявление. let и const имеют блочную область видимости, всплывают без инициализации (Temporal Dead Zone). const запрещает переприсваивание, но не иммутабельность объекта. let позволяет переприсваивать значение. Разница критична для предсказуемости кода и избежания багов в замыканиях.
Подробное объяснение
Основные различия между var, let и const в JavaScript касаются области видимости, всплытия (hoisting), возможности повторного объявления и переприсваивания.
-
Область видимости:
varограничен функцией (function scope), аletиconst- блоком (block scope), то есть фигурными скобками{}. Это означает, что переменная, объявленная черезvarвнутри цикла или условия, будет доступна за его пределами, что часто приводит к неожиданному поведению. -
Всплытие (hoisting): Все три типа объявлений поднимаются в начало своей области видимости. Однако
varинициализируется значениемundefined, поэтому к нему можно обратиться до строки объявления.letиconstнаходятся во временной мертвой зоне (Temporal Dead Zone, TDZ) от начала блока до момента объявления - обращение к ним до строки объявления вызываетReferenceError. -
Повторное объявление:
varдопускает повторное объявление одной и той же переменной в одной области видимости, что может затереть предыдущее значение.letиconstзапрещают повторное объявление в одной области, что предотвращает случайные перезаписи. -
Переприсваивание:
varиletпозволяют изменять значение переменной после объявления.constзапрещает переприсваивание - после инициализации переменная всегда ссылается на тот же объект или примитив. Однако для объектов и массивов это не означает иммутабельность: можно изменять их свойства или элементы. -
Глобальный объект: При объявлении
varна глобальном уровне создается свойство глобального объекта (например,windowв браузере).letиconstна глобальном уровне не создают свойств глобального объекта.
Для senior-разработчика важно понимать, что выбор между let и const - это не просто синтаксическое предпочтение, а инструмент для выражения намерений: const сигнализирует, что ссылка не будет переназначена, что упрощает чтение и рефакторинг кода. Использование var в современном коде обычно считается антипаттерном, за исключением legacy-кода или специфических случаев, когда нужно эмулировать функциональную область видимости.
На практике
В современном JavaScript (ES6+) стандартом де-факто является использование const по умолчанию для всех переменных, которые не требуют переприсваивания. let используется только когда значение переменной должно меняться (например, счетчик цикла, аккумулятор). var не используется в новом коде - его применение ограничено поддержкой очень старых браузеров или работой с legacy-кодом.
На практике это означает:
- Все
const, пока не понадобится переприсвоить. letдля переменных в циклахfor(особенно с замыканиями, гдеvarсоздает классическую проблему).- Никогда не использовать
varв новом коде, если нет веской причины (например, нужно, чтобы переменная была свойствомwindow).
Для senior-разработчика важно также учитывать, что const не делает объект иммутабельным - для полной неизменяемости нужно использовать Object.freeze() (поверхностно) или библиотеки вроде Immer.
Пример кода
JAVASCRIPT// Область видимостиfunction example() {if (true) {var a = 1; // function scopelet b = 2; // block scopeconst c = 3; // block scope}console.log(a); // 1 - доступноconsole.log(b); // ReferenceErrorconsole.log(c); // ReferenceError}// Всплытие и TDZconsole.log(x); // undefined (var)var x = 10;console.log(y); // ReferenceError: Cannot access 'y' before initializationlet y = 20;// Повторное объявлениеvar z = 1;var z = 2; // работает, z = 2let w = 1;let w = 2; // SyntaxError// Переприсваиваниеconst obj = { key: 'value' };obj.key = 'newValue'; // работаетobj = {}; // TypeError: Assignment to constant variable// Проблема var в цикле с замыканиемfor (var i = 0; i < 3; i++) {setTimeout(() => console.log(i), 100); // 3, 3, 3}for (let j = 0; j < 3; j++) {setTimeout(() => console.log(j), 100); // 0, 1, 2}
Как отвечать на собеседовании
Начни с ключевых различий: область видимости, всплытие, TDZ, повторное объявление и переприсваивание. Приведи конкретный пример с циклом и замыканием, чтобы показать практическую разницу между var и let. Упомяни, что const - это про ссылку, а не про значение, и что const не делает объект неизменяемым. Объясни, почему var считается устаревшим в современном коде, но не отрицай его существование в legacy-проектах. Для senior-уровня добавь рассуждение о том, как выбор объявления влияет на читаемость и поддерживаемость кода, и упомяни Temporal Dead Zone как механизм, предотвращающий ошибки доступа до инициализации.
Что проверяет интервьюер
Интервьюер проверяет:
- Понимание фундаментальных концепций: scope, hoisting, TDZ.
- Умение объяснить практические последствия выбора объявления.
- Знание типичных проблем (например, var в циклах) и способов их решения.
- Способность рассуждать о дизайне языка и best practices.
- Для senior - глубину понимания: почему TDZ была введена, как const влияет на семантику кода, когда var может быть оправдан.
Типичные ошибки
- Утверждение, что
constделает значение неизменяемым (путают с иммутабельностью). - Игнорирование Temporal Dead Zone и утверждение, что
let/constне всплывают. - Использование
varв современном коде без осознания последствий. - Непонимание, что
letв цикле создает новую привязку на каждой итерации. - Путаница между областью видимости функции и блока (например, думают, что
varограничен блокомif).
> Похожие задачи по frontend
Что происходит после отправки запроса в JavaScript
Как работает HttpOnly cookie и почему к нему нельзя достучаться с JavaScript
Как распределялось время между фронтендом и бэкендом в работе
Как создать промис, который возвращает результат первого успешно завершившегося промиса в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью