Встречается на 25% собеседований по JavaScript
В чем разница между var, let и const
В JavaScript var, let и const — это три способа объявления переменных, которые отличаются областью видимости, поведением при всплытии (hoisting) и возможностью изменения. var — устаревший способ с функциональной областью видимости, let и const — современные с блочной областью видимости, при этом const запрещает повторное присваивание.
Как это работает
Область видимости
varимеет функциональную область видимости: переменная доступна внутри всей функции, где объявлена, даже если объявлена внутри блока{}. Если объявлена вне функции — становится глобальной.letиconstимеют блочную область видимости: переменная доступна только внутри блока{}, где объявлена (например, внутриif,for,while).
Всплытие (hoisting)
varвсплывает: объявление переменной перемещается в начало функции, но инициализация остаётся на месте. До строки с присваиванием переменная имеет значениеundefined.letиconstне всплывают в том же смысле: они попадают во временную мёртвую зону (temporal dead zone) до момента инициализации. Обращение к ним до объявления вызываетReferenceError.
Изменение и переопределение
varможно переопределять и изменять в любой момент.letможно изменять (присваивать новое значение), но нельзя переопределить в той же области видимости (повторноеlet b = ...вызовет ошибку).constнельзя изменять (присваивать новое значение) и переопределять. Однако еслиconstхранит объект или массив, можно менять его свойства или элементы — это не считается изменением самой переменной.
Пример
javascript
if (true) {
var a = 1;
let b = 2;
const c = 3;
}
console.log(a); // 1 — var видна вне блока
console.log(b); // ReferenceError — let видна только внутри блока
console.log(c); // ReferenceError — const видна только внутри блока
const obj = { x: 1 };
obj.x = 2; // допустимо, меняем свойство объекта
console.log(obj.x); // 2
// obj = { y: 3 }; // TypeError: Assignment to constant variable.Подводные камни
- Временная мёртвая зона: обращение к
letилиconstдо объявления приводит к ошибке, даже если переменная уже объявлена ниже по коду. - В циклах
forсvarпеременная захватывается по ссылке, что приводит к классической проблеме с замыканиями.letсоздаёт новую переменную на каждой итерации, поэтому замыкания работают корректно. constне делает объект иммутабельным: можно менять свойства, но не саму переменную. Для полной неизменяемости нужныObject.freeze()или другие методы.- В глобальной области видимости
varсоздаёт свойство на объектеwindow, аletиconst— нет.
Когда использовать
- По умолчанию используйте
const— это делает намерение явным и защищает от случайного переприсваивания. - Используйте
let, когда нужно переприсваивать значение (например, счётчик в цикле). - Избегайте
varв новом коде: оно ведёт к неожиданному поведению из-за функциональной области видимости и всплытия. Исключение — поддержка очень старых браузеров, но это редкость.
Коротко
var— функциональная область видимости, всплытие, можно переопределять; устарел.let— блочная область видимости, нельзя переопределять, но можно изменять.const— блочная область видимости, нельзя переопределять и изменять (кроме свойств объектов/элементов массивов).- Правило:
constпо умолчанию,letпри необходимости переприсваивания,varне использовать.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы
