Sobes.tech
Junior

Aký je rozdiel medzi var, let a const?

sobes.tech AI

Odpoveď od AI

var má funkčný rozsah, zatiaľ čo let a const majú blokový rozsah. var môže byť znovu deklarovaný a priradený, let môže byť znovu priradený, ale nie znovu deklarovaný v rovnakom rozsahu, const nemôže byť ani znovu deklarovaný, ani priradený. Premenné deklarované pomocou var sú podrobené zdvihnutiu (hoisting) s inicializáciou na undefined, zatiaľ čo let a const sú tiež zdvihnuté, ale zostávajú v "časovej zóne smrti" až do inicializácie.

// `var` má funkčný rozsah
function exampleVar() {
  if (true) {
    var x = 10;
    console.log(x); // 10
  }
  console.log(x); // 10 (tu je viditeľný x)
}

// `let` a `const` majú blokový rozsah
function exampleLetConst() {
  if (true) {
    let y = 20;
    const z = 30;
    console.log(y); // 20
    console.log(z); // 30
  }
  // console.log(y); // Chyba ReferenceError: y nie je definované
  // console.log(z); // Chyba ReferenceError: z nie je definované
}

// `var` môže byť znovu deklarovaný a priradený
var a = 1;
var a = 2; // Znovu deklarovať
a = 3; // Znovu priradiť
console.log(a); // 3

// `let` môže byť priradený, ale nie znovu deklarovaný v rovnakom rozsahu
let b = 4;
// let b = 5; // SyntaxError: Identifikátor 'b' už je deklarovaný
b = 6; // Znovu priradiť
console.log(b); // 6

// `const` nemôže byť znovu priradený ani deklarovaný
const c = 7;
// const c = 8; // SyntaxError: Identifikátor 'c' už je deklarovaný
// c = 9; // TypeError: Priradenie ku konštantnej premennej
console.log(c); // 7 (pre primitivne typy)

// Zdvíhanie (hoisting)
console.log(hoistedVar); // undefined (var bol zdvihnutý a inicializovaný na undefined)
var hoistedVar = "Ja som var";

// console.log(hoistedLet); // Chyba ReferenceError: Cannot access 'hoistedLet' pred inicializáciou
// let hoistedLet = "Ja som let"; // Nachádza sa v časovej zóne smrti

Kľúčové rozdiely sú zhrnuté v tabuľke:

Vlastnosť var let const
Rozsah Funkčný Blokový Blokový
Znovu deklarovať Áno Nie (v rovnakom rozsahu) Nie
Znovu priradiť Áno Áno Nie (pre primitivne typy)
Zdvíhanie (hoisting) Áno (s undefined) Áno (v časovej zóne smrti) Áno (v časovej zóne smrti)
Počiatočná mutácia Nie je potrebná inicializácia Nie je potrebná inicializácia Vyžaduje inicializáciu

Je dôležité poznamenať, že pre objekty a polia deklarované s const, samotná premenná nemôže byť premenená na iný objekt/polí, ale obsah objektu/polia môže byť zmenený.

const myObject = { key: 'value' };
// myObject = { newKey: 'newValue' }; // Chyba TypeError: Priradenie ku konštantnej premennej
myObject.key = 'newValue'; // Môže
console.log(myObject); // { key: 'newValue' }

const myArray = [1, 2];
// myArray = [3, 4]; // Chyba TypeError: Priradenie ku konštantnej premennej
myArray.push(3); // Môže
console.log(myArray); // [ 1, 2, 3 ]