Junior
Koja je razlika između var, let i const?
sobes.tech АИ
Одговор од АИ
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 ]