Назад к вопросам
Junior
135
questionbank
В чем разница между var, let и const?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
var имеет функциональную область видимости, let и const — блочную. var можно переобъявлять и переназначать, let можно переназначать, но нельзя переобъявлять в той же области видимости, const нельзя ни переобъявлять, ни переназначать. Переменные, объявленные с помощью var, подвержены поднятию (hoisting) с инициализацией undefined, let и const подвержены поднятию, но остаются в "временной мертвой зоне" до инициализации.
// var имеет функциональную область видимости
function exampleVar() {
if (true) {
var x = 10;
console.log(x); // 10
}
console.log(x); // 10 (x виден здесь)
}
// let и const имеют блочную область видимости
function exampleLetConst() {
if (true) {
let y = 20;
const z = 30;
console.log(y); // 20
console.log(z); // 30
}
// console.log(y); // Ошибка ReferenceError: y is not defined
// console.log(z); // Ошибка ReferenceError: z is not defined
}
// var можно переназначать и переобъявлять
var a = 1;
var a = 2; // Переобъявление
a = 3; // Переназначение
console.log(a); // 3
// let можно переназначать, но нельзя переобъявлять в той же области видимости
let b = 4;
// let b = 5; // Ошибка SyntaxError: Identifier 'b' has already been declared
b = 6; // Переназначение
console.log(b); // 6
// const нельзя переназначать или переобъявлять
const c = 7;
// const c = 8; // Ошибка SyntaxError: Identifier 'c' has already been declared
// c = 9; // Ошибка TypeError: Assignment to constant variable.
console.log(c); // 7 (для примитивных типов)
// Поднятие (hoisting)
console.log(hoistedVar); // undefined (var поднята и инициализирована undefined)
var hoistedVar = "Я var";
// console.log(hoistedLet); // Ошибка ReferenceError: Cannot access 'hoistedLet' before initialization
// let hoistedLet = "Я let"; // Находится в временной мертвой зоне
Ключевые различия сведены в таблицу:
| Особенность | var |
let |
const |
|---|---|---|---|
| Область видимости | Функциональная | Блочная | Блочная |
| Переобъявление | Да | Нет (в той же области) | Нет |
| Переназначение | Да | Да | Нет (для примитивов) |
| Поднятие | Да (с undefined) |
Да (в временной мертвой зоне) | Да (в временной мертвой зоне) |
| Начальная мутация | Не требуется инициализация | Не требуется инициализация | Требуется инициализация |
Важно отметить, что для объектов и массивов, объявленных с const, сама переменная не может быть переназначена к другому объекту/массиву, но содержимое объекта/массива может быть изменено.
const myObject = { key: 'value' };
// myObject = { newKey: 'newValue' }; // Ошибка TypeError: Assignment to constant variable.
myObject.key = 'newValue'; // Возможно
console.log(myObject); // { key: 'newValue' }
const myArray = [1, 2];
// myArray = [3, 4]; // Ошибка TypeError: Assignment to constant variable.
myArray.push(3); // Возможно
console.log(myArray); // [ 1, 2, 3 ]