Назад к вопросам
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 ]