Sobes.tech
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 ]