Sobes.tech
Junior

Kāda ir atšķirība starp var, let un const?

sobes.tech AI

Atbilde no AI

var ir funkcijas līmeņa redzama, bet let un const — bloka līmeņa. var var atkārtoti deklarēt un pārrakstīt, let var pārrakstīt, bet nevar atkārtoti deklarēt tajā pašā redzeslokā, const nedrīkst ne atkārtoti deklarēt, ne pārrakstīt. Mainīgie, kas deklarēti ar var, ir pakļauti pacelšanai (hoisting) ar inicializāciju uz undefined, let un const ir pakļauti pacelšanai, bet paliek "laika miršanas zonā" līdz to inicializācijai.

// var ir funkcijas līmeņa redzamība
function exampleVar() {
  if (true) {
    var x = 10;
    console.log(x); // 10
  }
  console.log(x); // 10 (x ir redzams šeit)
}

// let un const ir bloka līmeņa redzamība
function exampleLetConst() {
  if (true) {
    let y = 20;
    const z = 30;
    console.log(y); // 20
    console.log(z); // 30
  }
  // console.log(y); // Kļūda ReferenceError: y nav definēts
  // console.log(z); // Kļūda ReferenceError: z nav definēts
}

// var var pārrakstīt un atkārtoti deklarēt
var a = 1;
var a = 2; // Atkārtota deklarācija
a = 3; // Pārrakstīšana
console.log(a); // 3

// let var pārrakstīt, bet nevar atkārtoti deklarēt tajā pašā redzeslokā
let b = 4;
// let b = 5; // Kļūda SyntaxError: Identifier 'b' ir jau deklarēts
b = 6; // Pārrakstīšana
console.log(b); // 6

// const nedrīkst ne pārrakstīt, ne atkārtoti deklarēt
const c = 7;
// const c = 8; // Kļūda SyntaxError: Identifier 'c' ir jau deklarēts
// c = 9; // Kļūda TypeError: Pievienošana konstantes mainīgajam.
console.log(c); // 7 (primitīviem tipiem)

// Pacelšana (hoisting)
console.log(hoistedVar); // undefined (var ir pacelts un inicializēts ar undefined)
var hoistedVar = "Es esmu var";

// console.log(hoistedLet); // Kļūda ReferenceError: Cannot access 'hoistedLet' before initialization
// let hoistedLet = "Es esmu let"; // Atrodas laika miršanas zonā

Galvenās atšķirības ir apkopotas tabulā:

Īpašība var let const
Redzamības līmenis Funkcijas līmenis Bloka līmenis Bloka līmenis
Atkārtota deklarēšana Nē (tajā pašā redzeslokā)
Pārrakstīšana Nē (primitīviem)
Pacelšana (hoisting) Jā (ar undefined) Jā (laika miršanas zonā) Jā (laika miršanas zonā)
Sākotnējā mutācija Nav nepieciešama inicializācija Nav nepieciešama inicializācija Nepieciešama inicializācija

Svarīgi atzīmēt, ka objektiem un masīviem, kas deklarēti ar const, pati mainīgā var tikt pārrakstīta ar citu objektu/masīvu, bet objekta/masīva saturs var tikt mainīts.

const myObject = { key: 'value' };
// myObject = { jaunaKey: 'jaunaVērtība' }; // Kļūda TypeError: Pievienošana konstantes mainīgajam.
myObject.key = 'jaunaVērtība'; // Iespējams
console.log(myObject); // { key: 'jaunaVērtība' }

const myArray = [1, 2];
// myArray = [3, 4]; // Kļūda TypeError: Pievienošana konstantes mainīgajam.
myArray.push(3); // Iespējams
console.log(myArray); // [ 1, 2, 3 ]