Sobes.tech
Junior

Jaký je rozdíl mezi var, let a const?

sobes.tech AI

Odpověď od AI

var má funkční rozsah, zatímco let a const mají blokový rozsah. var lze znovu deklarovat a přiřadit, let lze znovu přiřadit, ale nelze jej znovu deklarovat ve stejném rozsahu, const nelze ani deklarovat, ani přiřadit. Proměnné deklarované pomocí var jsou přiřazeny (hoisted) s inicializací na undefined, zatímco let a const jsou také hoisted, ale zůstávají v "časové zóně smrti" do inicializace.

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

// `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 není definováno
  // console.log(z); // Chyba ReferenceError: z není definováno
}

// `var` lze znovu deklarovat a přiřadit
var a = 1;
var a = 2; // Znovu deklarovat
a = 3; // Znovu přiřadit
console.log(a); // 3

// `let` lze znovu přiřadit, ale nelze znovu deklarovat ve stejném rozsahu
let b = 4;
// let b = 5; // SyntaxError: Identifikátor 'b' již byl deklarován
b = 6; // Znovu přiřadit
console.log(b); // 6

// `const` nelze znovu přiřadit ani deklarovat
const c = 7;
// const c = 8; // SyntaxError: Identifikátor 'c' již byl deklarován
// c = 9; // TypeError: Přiřazení do konstantní proměnné
console.log(c); // 7 (pro primitivní typy)

// Hoisting (zvedání)
console.log(hoistedVar); // undefined (var byl zvednut a inicializován na undefined)
var hoistedVar = "Já to var";

// console.log(hoistedLet); // Chyba ReferenceError: Nelze přistoupit k 'hoistedLet' před inicializací
// let hoistedLet = "Já to let"; // Nachází se v časové zóně smrti

Klíčové rozdíly shrnuty v tabulce:

Vlastnost var let const
Rozsah Funkční Blokový Blokový
Znovu deklarovat Ano Ne (ve stejném rozsahu) Ne
Znovu přiřadit Ano Ano Ne (pro primitivní typy)
Hoisting Ano (s undefined) Ano (v časové zóně smrti) Ano (v časové zóně smrti)
Počáteční modifikace Není potřeba inicializace Není potřeba inicializace Vyžaduje inicializaci

Je důležité poznamenat, že u objektů a polí deklarovaných pomocí const nemůže být samotná proměnná přepsána na jiný objekt nebo pole, ale obsah objektu nebo pole může být změněn.

const myObject = { key: 'value' };
// myObject = { newKey: 'newValue' }; // Chyba TypeError: Přiřazení do konstantní proměnné
myObject.key = 'newValue'; // Je možné
console.log(myObject); // { key: 'newValue' }

const myArray = [1, 2];
// myArray = [3, 4]; // Chyba TypeError: Přiřazení do konstantní proměnné
myArray.push(3); // Je možné
console.log(myArray); // [ 1, 2, 3 ]