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 ]