Sobes.tech
Junior

Каква е разликата между var, let и const?

sobes.tech AI

Отговор от 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 не е дефинирано
  // console.log(z); // Грешка ReferenceError: z не е дефинирано
}

// `var` може да бъде преобявен и преназначен
var a = 1;
var a = 2; // Преобявяване
a = 3; // Преназначаване
console.log(a); // 3

// `let` може да бъде преназначен, но не и преобявен в същата област
let b = 4;
// let b = 5; // Грешка SyntaxError: Идентификатор 'b' вече е деклариран
b = 6; // Преназначаване
console.log(b); // 6

// `const` не може да бъде преназначен или преобявен
const c = 7;
// const c = 8; // Грешка SyntaxError: Идентификатор 'c' вече е деклариран
// c = 9; // Грешка TypeError: Присвояване към константна променлива
console.log(c); // 7 (за примитивни типове)

// Издигане (hoisting)
console.log(hoistedVar); // undefined (var е издигнато и инициализирано с undefined)
var hoistedVar = "Аз съм var";

// console.log(hoistedLet); // Грешка ReferenceError: Cannot access 'hoistedLet' преди инициализация
// let hoistedLet = "Аз съм let"; // Временната зона на мъртвата зона

Ключовите разлики са обобщени в таблицата:

Характеристика var let const
Област на видимост Функционална Блокова Блокова
Преобявяне Да Не (в същата област) Не
Преназначаване Да Да Не (за примитиви)
Издигане (hoisting) Да (с undefined) Да (в временната зона) Да (в временната зона)
Начална мутация Не е необходима инициализация Не е необходима инициализация Необходима е инициализация

Важно е да се отбележи, че за обекти и масиви, обявени с const, самата променлива не може да бъде преназначена към друг обект/масив, но съдържанието на обекта/масива може да бъде променено.

const myObject = { key: 'value' };
// myObject = { newKey: 'newValue' }; // Грешка TypeError: Присвояване към константна променлива
myObject.key = 'newValue'; // Възможно
console.log(myObject); // { key: 'newValue' }

const myArray = [1, 2];
// myArray = [3, 4]; // Грешка TypeError: Присвояване към константна променлива
myArray.push(3); // Възможно
console.log(myArray); // [ 1, 2, 3 ]