Sobes.tech
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 ]