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: 'hoistedLet'ке жетүү мүмкүн эмес, баштапкы мааниге чейин
// let hoistedLet = "Мен `let`мин"; // убактылуу өлүм зонасында

Негизги айырмачылыктар таблицада топтолгон:

Өзгөчөлүк var let const
Чөйрө Функционалдык Блоктук Блоктук
Кайталап жарыялоо Ооба Жок (бир эле чөйрөдө) Жок
Кайталап белгилөө Ооба Ооба Жок (примитивдер үчүн)
Көтөрүү (hoisting) Ооба (белгиленген эмес) Ооба (убактылуу өлүм зонасында) Ооба (убактылуу өлүм зонасында)
Баштапкы өзгөртүү Инициализация талап кылынбайт Инициализация талап кылынбайт Инициализация талап кылынат

Маанилүү: const менен жарыяланган объекттер жана массивдер үчүн, өзгөрмө башка объектке/массивге белгиленбейт, бирок объекттин/массивдин мазмуну өзгөртүлүшү мүмкүн.

const myObject = { key: 'value' };
// myObject = { newKey: 'newValue' }; // Катуу каталар TypeError: белгиленген өзгөрмөгө белгилөө
myObject.key = 'жаңы маані'; // Мүмкүн
console.log(myObject); // { key: 'жаңы маані' }

const myArray = [1, 2];
// myArray = [3, 4]; // Катуу каталар TypeError: белгиленген өзгөрмөгө белгилөө
myArray.push(3); // Мүмкүн
console.log(myArray); // [ 1, 2, 3 ]