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 ]