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 ]