var, let, const o'rtasidagi farq nimada?

JuniorJavaScript #javascript #variables

Savol

var, let va const bir-biridan nimasi bilan farq qiladi?

Qisqa javob

var — funksional ko'rinish sohasi, undefined bilan initsializatsiya qilinib ko'tariladi (hoisting), qayta e'lon qilish mumkin. let/const — blokli ko'rinish sohasi, e'lon qilinguncha "temporal dead zone"ga tushadi. const qo'shimcha ravishda o'zgaruvchini qayta o'zlashtirishni taqiqlaydi.

Batafsil javob

  • Ko'rinish sohasi: var e'lon qilingan funksiyaning butun hududida ko'rinadi ({}, if, for bloklarini e'tiborsiz qoldiradi). let/const faqat e'lon qilingan blok ichida ko'rinadi.
  • Hoisting (ko'tarilish): barcha e'lonlar kompilyatsiya bosqichida ko'rinish sohasining boshiga ko'tariladi, lekin turlicha xatti-harakat qiladi:
    • var ko'tariladi va darhol undefined sifatida initsializatsiya qilinadi — e'lon qilingan qatorgacha unga murojaat qilish mumkin, undefined olasiz.
    • let/const ham ko'tariladi, lekin temporal dead zone (TDZ) ga tushadi — e'lon qilinguncha murojaat qilish ReferenceError tashlaydi.
  • Qayta e'lon qilish: var bir xil ko'rinish sohasida xatosiz qayta e'lon qilinishi mumkin. let/const — mumkin emas (SyntaxError).
  • Qayta o'zlashtirish: var/let qayta o'zlashtirilishi mumkin. const — mumkin emas, urinish TypeError tashlaydi. Muhim: const o'zgaruvchining o'zini qayta o'zlashtirishni taqiqlaydi, lekin u havola qilayotgan obyekt/massivning mutatsiyasini taqiqlamaydi.

Misol

console.log(a) // undefined (hoisting)
var a = 1

console.log(b) // ReferenceError (TDZ)
let b = 2

const obj = { count: 0 }
obj.count++ // OK — obyektni mutatsiya qilyapmiz, o'zgaruvchini qayta o'zlashtirmayapmiz
obj.count = 5 // OK

obj = {} // TypeError: Assignment to constant variable

if (true) {
  var x = 'funksiya-doirasida'
  let y = 'blok-doirasida'
}
console.log(x) // 'funksiya-doirasida'
console.log(y) // ReferenceError: y is not defined

Qo'shimcha savollar

  • Temporal dead zone nima va u nima uchun kerak?
  • Nega zamonaviy kodda var deyarli ishlatilmaydi?
  • const orqali e'lon qilingan massivning mazmunini o'zgartirish mumkinmi?