Sobes.tech
Junior

Mi a különbség a var, let és const között?

sobes.tech MI

Válasz az MI-től

A var funkcionális hatókörrel rendelkezik, míg a let és const blokk hatókörrel. A var újra deklarálható és újra rendelhető, a let újra rendelhető, de nem deklarálható újra ugyanabban a hatókörben, a const sem deklarálható, sem nem rendelhető újra. A var-ral deklarált változók fel vannak emelve (hoisted) undefined-del, míg a let és const fel vannak emelve, de a "ideiglenes halálzónában" maradnak az inicializálásukig.

// a `var` funkcionális hatókörrel rendelkezik
function exampleVar() {
  if (true) {
    var x = 10;
    console.log(x); // 10
  }
  console.log(x); // 10 (itt látható a x)
}

// a `let` és `const` blokk hatókörrel rendelkezik
function exampleLetConst() {
  if (true) {
    let y = 20;
    const z = 30;
    console.log(y); // 20
    console.log(z); // 30
  }
  // console.log(y); // Hiba ReferenceError: y nincs definiálva
  // console.log(z); // Hiba ReferenceError: z nincs definiálva
}

// a `var` újra deklarálható és újra rendelhető
var a = 1;
var a = 2; // Újra deklarálás
a = 3; // Újrarendelés
console.log(a); // 3

// a `let` újra rendelhető, de nem deklarálható újra ugyanabban a hatókörben
let b = 4;
// let b = 5; // Hiba SyntaxError: Azonosító 'b' már deklarálva
b = 6; // Újrarendelés
console.log(b); // 6

// a `const` nem rendelhető újra vagy deklarálható újra
const c = 7;
// const c = 8; // Hiba SyntaxError: Azonosító 'c' már deklarálva
// c = 9; // Hiba TypeError: Átadás állandó változónak
console.log(c); // 7 (primitív típusokra)

// a felhúzás (hoisting)
console.log(hoistedVar); // undefined (a var felhúzódott és undefined-ként inicializálódott)
var hoistedVar = "Én a var";

// console.log(hoistedLet); // Hiba ReferenceError: Cannot access 'hoistedLet' before initialization
// let hoistedLet = "Én a let"; // Ideiglenes halálzónában van

A fő különbségek összefoglalva a táblázatban:

Jellemző var let const
Hatókör Funkcionális Blokk Blokk
Újra deklarálható Igen Nem (azon hatókörben) Nem
Újra rendelhető Igen Igen Nem (primitív típusokra)
Felhúzás (hoisting) Igen (undefined-del) Igen (ideiglenes halálzónában) Igen (ideiglenes halálzónában)
Kezdeti módosítás Nem szükséges inicializálás Nem szükséges inicializálás Inicializálás szükséges

Fontos megjegyezni, hogy az objektumokra és tömbökre, amelyeket const-tal deklaráltak, maga a változó nem módosítható más objektumra/tömbre, de az objektum vagy tömb tartalma módosítható.

const myObject = { key: 'value' };
// myObject = { newKey: 'newValue' }; // Hiba TypeError: Átadás állandó változónak.
myObject.key = 'newValue'; // Lehetséges
console.log(myObject); // { key: 'newValue' }

const myArray = [1, 2];
// myArray = [3, 4]; // Hiba TypeError: Átadás állandó változónak.
myArray.push(3); // Lehetséges
console.log(myArray); // [ 1, 2, 3 ]