Junior
Kuo skiriasi var, let ir const?
sobes.tech AI
Atsakymas iš AI
var turi funkcijos apimties sritį, o let ir const turi blokų apimtį. var galima perrašyti ir priskirti iš naujo, let galima priskirti iš naujo, bet ne perrašyti tame pačiame apimtyje, const negali būti nei perrašyta, nei perrašyta. Kintamieji, deklaruoti su var, yra pakeliami (hoisted) su inicializacija undefined, o let ir const taip pat pakeliami, bet lieka "laikinoje mirties zonoje" iki inicializacijos.
// `var` turi funkcijos apimtį
function exampleVar() {
if (true) {
var x = 10;
console.log(x); // 10
}
console.log(x); // 10 (čia x matomas)
}
// `let` ir `const` turi blokų apimtį
function exampleLetConst() {
if (true) {
let y = 20;
const z = 30;
console.log(y); // 20
console.log(z); // 30
}
// console.log(y); // Klaida ReferenceError: y nėra apibrėžtas
// console.log(z); // Klaida ReferenceError: z nėra apibrėžtas
}
// `var` galima perrašyti ir perkelti
var a = 1;
var a = 2; // Perrašymas
a = 3; // Priskyrimas
console.log(a); // 3
// `let` galima priskirti iš naujo, bet ne perrašyti tame pačiame apimtyje
let b = 4;
// let b = 5; // Sintaksės klaida SyntaxError: identifikatorius 'b' jau deklaruotas
b = 6; // Priskyrimas
console.log(b); // 6
// `const` negalima priskirti iš naujo ar perrašyti
const c = 7;
// const c = 8; // Sintaksės klaida SyntaxError: identifikatorius 'c' jau deklaruotas
// c = 9; // Tipų klaida TypeError: priskyrimas prie konstantinės kintamosios
console.log(c); // 7 (priemonių tipams)
// Pakėlimas (hoisting)
console.log(hoistedVar); // undefined (var pakeltas ir inicializuotas kaip `undefined`)
var hoistedVar = "Aš esu var";
// console.log(hoistedLet); // Klaida ReferenceError: Negalima pasiekti 'hoistedLet' prieš inicializaciją
// let hoistedLet = "Aš esu let"; // Laikina mirties zona
Svarbiausi skirtumai apibendrinti lentelėje:
| Savybė | var |
let |
const |
|---|---|---|---|
| Apimtis | Funkcinė | Blokinė | Blokinė |
| Perrašymas | Taip | Ne (toje pačioje apimtyje) | Ne |
| Priskyrimas | Taip | Taip | Ne (priemonių tipams) |
| Pakėlimas (hoisting) | Taip (su undefined) |
Taip (laikinoje mirties zonoje) | Taip (laikinoje mirties zonoje) |
| Pradinis mutavimas | Nereikalinga inicializacija | Nereikalinga inicializacija | Reikalaujama inicializacija |
Svarbu pažymėti, kad const-u deklaruoti objektai ir masyvai, patys kintamieji negali būti perrašyti į kitą objektą ar masyvą, tačiau objekto ar masyvo turinys gali būti keičiamas:
const myObject = { key: 'value' };
// myObject = { newKey: 'newValue' }; // Klaida TypeError: Priskyrimas prie konstantinės kintamosios
myObject.key = 'nauja reikšmė'; // Galima
console.log(myObject); // { key: 'nauja reikšmė' }
const myArray = [1, 2];
// myArray = [3, 4]; // Klaida TypeError: Priskyrimas prie konstantinės kintamosios
myArray.push(3); // Galima
console.log(myArray); // [ 1, 2, 3 ]