Sobes.tech
Junior

Ի՞նչ է տարբերությունը var, let և const-ի միջև։

sobes.tech AI

Պատասխան AI-ից

var ունի գործառնական տեսանելիության տարածք, մինչդեռ let և const ունեն բլոկային։ var կարող է կրկին հայտարարվել և վերաօղակվել, let կարող է վերաօղակվել, բայց ոչ նույն տարածքում, const չի կարող ոչ վերաօղակվել, ոչ վերաօղակվել։ var-ով հայտարարված փոփոխականները ենթարկվում են բարձրացման (hoisting) undefined-ով, մինչդեռ let և const նույնպես բարձրացվում են, բայց մնում են "ժամանակային մահվան գոտում" մինչև սկզբնական արժեքը։

// `var` ունի գործառնական տարածք
function exampleVar() {
  if (true) {
    var x = 10;
    console.log(x); // 10
  }
  console.log(x); // 10 (այստեղ x-ն տեսանելի է)
}

// `let` և `const` ունեն բլոկային տարածք
function exampleLetConst() {
  if (true) {
    let y = 20;
    const z = 30;
    console.log(y); // 20
    console.log(z); // 30
  }
  // console.log(y); // Գործառնական սխալ ReferenceError: y չի սահմանված
  // console.log(z); // Գործառնական սխալ ReferenceError: z չի սահմանված
}

// `var` կարող է կրկին հայտարարվել և վերաօղակվել
var a = 1;
var a = 2; // Կրկին հայտարարում
a = 3; // Վերաօղակում
console.log(a); // 3

// `let` կարող է վերաօղակվել, բայց ոչ կրկին հայտարարվել նույն տարածքում
let b = 4;
// let b = 5; // Սինտաքսային սխալ SyntaxError: Ասեղնավոր 'b' արդեն հայտարարված է
b = 6; // Վերաօղակում
console.log(b); // 6

// `const` չի կարող վերաօղակվել կամ կրկին հայտարարվել
const c = 7;
// const c = 8; // Սինտաքսային սխալ SyntaxError: Ասեղնավոր 'c' արդեն հայտարարված է
// c = 9; // Տիպային սխալ TypeError: Հաստատուն փոփոխականին վերաօղակել
console.log(c); // 7 (պրիմիտիվ տիպերի համար)

// Բարձրացում (hoisting)
console.log(hoistedVar); // undefined (var բարձրացվել է և սկզբնական արժեքը `undefined`)
var hoistedVar = "Ես var եմ";

// console.log(hoistedLet); // Գործառնական սխալ ReferenceError: Cannot access 'hoistedLet' նախքան սկզբնական արժեքը
// let hoistedLet = "Ես let եմ"; // Ժամանակային մահվան գոտում է

Հիմնական տարբերությունները ամփոփված են աղյուսակում՝

Գծագիր var let const
Տարածք Գործառնական Բլոկային Բլոկային
Կրկին հայտարարում Այո Ոչ (նույն տարածքում) Ոչ
Վերաօղակվել Այո Այո Ոչ (պրիմիտիվների համար)
Բարձրացում Այո (սպասարկում է undefined) Այո (ժամանակային մահվան գոտում) Այո (ժամանակային մահվան գոտում)
Նախնական մուտացիա Պահանջվում է սկզբնական արժեք Պահանջվում է սկզբնական արժեք Պահանջվում է սկզբնական արժեք

Կարևոր է նշել, որ const-ով հայտարարված օբյեկտների և զանգվածների դեպքում, փոփոխականը չի կարող վերաօղակվել այլ օբյեկտի կամ զանգվածի, բայց օբյեկտի կամ զանգվածի պարունակությունը կարող է փոխվել:

const myObject = { key: 'value' };
// myObject = { newKey: 'newValue' }; // Սխալ TypeError: Հաստատուն փոփոխականին վերաօղակել
myObject.key = 'newValue'; // Միջնորդական
console.log(myObject); // { key: 'newValue' }

const myArray = [1, 2];
// myArray = [3, 4]; // Սխալ TypeError: Հաստատուն փոփոխականին վերաօղակել
myArray.push(3); // Միջնորդական
console.log(myArray); // [ 1, 2, 3 ]