> В чем разница между var, const и let в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: ЛитРес
Стек: JavaScript
> Пример ответа
Короткий ответ
var - устаревший способ объявления с функциональной областью видимости и всплытием без временной мёртвой зоны. let и const - современные, с блочной областью видимости и TDZ. const запрещает переприсваивание, но не мутацию объектов. Основное правило: используйте const по умолчанию, let - когда нужно переприсваивание, var - никогда в новом коде.
Подробное объяснение
Область видимости:
- var - функциональная или глобальная. Переменная доступна внутри всей функции, даже если объявлена в блоке
ifилиfor. - let и const - блочная. Переменная существует только внутри блока
{}, где объявлена.
Всплытие (hoisting):
- var - объявление всплывает в начало функции, инициализация остаётся на месте. До строки объявления переменная существует со значением
undefined. - let и const - тоже всплывают, но не инициализируются. До объявления доступ к ним вызывает ReferenceError - это временная мёртвая зона (TDZ).
Переприсваивание:
- var и let - можно переприсваивать значения.
- const - нельзя переприсваивать. Но если значение - объект или массив, его свойства и элементы можно изменять.
Повторное объявление:
- var - можно объявить ту же переменную несколько раз в одной области видимости, ошибки не будет.
- let и const - повторное объявление в той же области видимости вызывает SyntaxError.
Глобальный объект:
- var на верхнем уровне создаёт свойство на
window(в браузере) илиglobal(в Node.js). - let и const - не создают свойств на глобальном объекте.
На практике
В реальном коде:
- Используйте
constдля всех значений, которые не должны переприсваиваться - это большинство переменных. - Используйте
letдля счётчиков циклов, аккумуляторов и любых значений, которые меняются в процессе выполнения. - Никогда не используйте
varв новом коде. Если встречаетеvarв legacy-коде, при рефакторинге заменяйте наletилиconst.
Типичные сценарии:
- Цикл
forсletсоздаёт новую привязку на каждой итерации - это решает классическую проблему с замыканиями. constне защищает от мутаций - для неизменяемых структур используйтеObject.freeze()или библиотеки типа Immutable.js.- В Node.js модули уже имеют свою область видимости, поэтому
varна верхнем уровне модуля не попадает вglobal.
Пример кода
JAVASCRIPT// Область видимостиfunction scopeExample() {if (true) {var varVariable = 'var';let letVariable = 'let';const constVariable = 'const';}console.log(varVariable); // 'var' - доступноconsole.log(letVariable); // ReferenceErrorconsole.log(constVariable); // ReferenceError}// Всплытие и TDZconsole.log(varHoisted); // undefined// console.log(letHoisted); // ReferenceErrorvar varHoisted = 'value';let letHoisted = 'value';// const и мутацииconst obj = { count: 1 };obj.count = 2; // работает// obj = { count: 3 }; // TypeError// Цикл с letfor (let i = 0; i < 3; i++) {setTimeout(() => console.log(i), 0); // 0, 1, 2}for (var j = 0; j < 3; j++) {setTimeout(() => console.log(j), 0); // 3, 3, 3}
Как отвечать на собеседовании
Начните с ключевого различия: область видимости и TDZ. Затем переходите к практическому правилу - const по умолчанию, let при необходимости переприсваивания. Упомяните проблему с замыканиями в цикле как мотивацию для блочной области видимости. Если спросят про var - скажите, что это legacy-механизм, который не нужен в современном коде. Хорошо показать понимание, что const не означает неизменяемость.
Что проверяет интервьюер
Интервьюер проверяет:
- Понимание областей видимости - функциональная против блочной.
- Знание механизма всплытия и временной мёртвой зоны.
- Умение объяснить, почему
letв цикле решает проблему замыканий. - Понимание разницы между переприсваиванием и мутацией для
const. - Осознание, когда какой механизм использовать в реальной разработке.
Типичные ошибки
- Утверждение, что
constделает объекты неизменяемыми - это не так. - Забывают про TDZ и думают, что
letиconstне всплывают вообще. - Говорят, что
var- это просто "старый let", не упоминая функциональную область видимости. - Путают повторное объявление и переприсваивание:
letнельзя объявить дважды, но можно переприсвоить. - Не упоминают, что
varна верхнем уровне создаёт свойство глобального объекта, аletиconst- нет.
> Похожие задачи по frontend
Что такое всплытие (hoisting) в JavaScript?
Что такое промисы в JavaScript и как они работают
Что такое каррирование
Что такое контекст (this) в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью