Ma'lumot turlari

Primitivlar metodlari

JavaScript primitivlar (satrlar, sonlar) bilan xuddi ular obyektdek ishlashga imkon beradi: ularda metodlar chaqirish mumkin. Ushbu darsda buning sirini โ€” "obyekt o'ramchasi" (wrapper) g'oyasini o'rganamiz.

Primitiv va obyekt farqi

Avval ikki tushunchani aniq ajratamiz. Primitiv โ€” bu bitta oddiy qiymat. JavaScript'da 7 ta primitiv tur bor: string, number, bigint, boolean, symbol, null va undefined.

Obyekt โ€” bu bir nechta qiymatni xususiyatlar (properties) sifatida saqlay oladigan murakkab tuzilma. U jingalak qavslar {...} yordamida yaratiladi va ichida metodlar (funksiya bo'lgan xususiyatlar) saqlashi mumkin.

// obyekt โ€” ichida ma'lumot va metod bor
let foydalanuvchi = {
  ism: "Ali",
  salom: function() {
    return "Salom!";
  }
};

// obyektning metodini chaqiramiz
foydalanuvchi.salom();  // "Salom!"

Obyektlar primitivlarga qaraganda "og'irroq" โ€” ular xotirada ko'proq joy egallaydi va ularni boshqarish uchun ichki mexanizmlar kerak bo'ladi.

Muammo: primitivda ham metod kerak

Til yaratuvchilari qiyin masalaga duch kelishgan. Bir tomondan, satrlar yoki sonlar bilan ko'p foydali amallar bajarish qulay bo'lardi. Masalan, satrni katta harflarga o'girish yoki uning uzunligini bilish. Bu amallar metodlar orqali ifodalansa juda qulay.

Ikkinchi tomondan, primitivlar imkon qadar tez va yengil bo'lishi kerak. Agar har bir son yoki satr og'ir obyekt bo'lsa, dastur juda sekinlashib qolardi.

Yechim ancha nafis. Mana uning mohiyati:

  1. Primitivlar oddiy va yengil qiymatlar bo'lib qolaveradi;
  2. Til esa satr, son, mantiqiy qiymat va symbol'lar uchun metod hamda xususiyatlarga kirishga ruxsat beradi;
  3. Buning ishlashi uchun primitivda metod chaqirilganida, maxsus "obyekt o'ramchasi" (wrapper) yaratiladi. U kerakli funksionallikni beradi va shundan keyin yo'q qilinadi.

Obyekt o'ramchasi (wrapper) qanday ishlaydi?

"O'ramchi obyektlar" har bir primitiv tur uchun mavjud va ular quyidagicha nomlanadi: String, Number, Boolean, BigInt va Symbol. Ular turli xil metodlar to'plamini taqdim etadi.

Masalan, satr uchun str.toUpperCase() metodi mavjud โ€” u satrni katta harflarga o'giradi. Uni chaqirganingizda nima ro'y beradi:

  1. str โ€” bu primitiv satr. Unga murojaat qilingan payt maxsus obyekt yaratiladi, u satr qiymatini va toUpperCase() kabi foydali metodlarni biladi;
  2. Metod bajariladi va yangi satr qaytaradi (buni konsol ko'rsatadi);
  3. Maxsus obyekt yo'q qilinadi, primitiv str esa o'zgarmasdan qoladi.

Ya'ni primitivlar metod bera oladi, lekin o'zi baribir yengil bo'lib qolaveradi. JavaScript dvigateli bu jarayonni juda samarali optimallashtiradi, hatto ko'pincha hech qanday qo'shimcha obyekt yaratmaydi.

Quyidagi misolni ishga tushiring โ€” satr metodlari qanday natija berishini ko'ring:

primitiv-satr.js
// natija shu yerda chiqadi
Diqqat qiling: toUpperCase() asl satrni o'zgartirmaydi, balki yangi satr qaytaradi. Primitivlar o'zgarmas (immutable) โ€” ularni tahrirlab bo'lmaydi, faqat yangi qiymat yaratish mumkin.

Sonlarda ham metodlar bor

Sonlar ham primitiv, lekin ularda ham metodlar mavjud. Masalan, toFixed(n) โ€” sonni kasr qismidagi belgilar sonini n ga qadar yaxlitlaydi va satr qaytaradi:

primitiv-son.js
// natija shu yerda chiqadi
Butun sonda to'g'ridan-to'g'ri metod chaqirmoqchi bo'lsangiz, ikki nuqta qo'ying yoki qavsdan foydalaning. Masalan, 123456..toString() yoki (123456).toString(). Chunki bitta nuqta 123456.toString()'da JavaScript nuqtani o'nlik kasr deb o'ylab, xatoga yo'l qo'yishi mumkin.

null va undefined'da metod yo'q

Ikkita alohida primitiv โ€” null va undefined โ€” bu qoidadan istisno. Ular o'ramchi obyektga ega emas va hech qanday metod bermaydi. Ular "eng bo'sh" primitivlar hisoblanadi.

// bu XATO beradi!
null.test;       // TypeError
undefined.test;  // TypeError

Agar null yoki undefined'da metod yoki xususiyatga murojaat qilsangiz, dastur TypeError xatosi bilan to'xtaydi. Shu sabab qiymat bilan ishlashdan oldin uning null/undefined emasligiga ishonch hosil qilish muhim.

Amalda ko'p xatolar aynan null yoki undefined'da metod chaqirishdan kelib chiqadi. Masalan, mavjud bo'lmagan obyekt xususiyatidan qiymat olmoqchi bo'lganda. Bunga e'tibor bering.

O'ramchi obyektni qo'lda yaratmang

Nazariy jihatdan new Number(5) yoki new String("salom") orqali o'ramchi obyektni qo'lda yaratish mumkin, lekin buni hech qachon qilmang. Bu chalkashlik va kutilmagan xatolarga olib keladi:

wrapper-xato.js
// natija shu yerda chiqadi
new String, new Number, new Boolean'ni hech qachon ishlatmang. Lekin newsiz oddiy funksiya sifatida chaqirish (masalan Number("123")) โ€” bu boshqa narsa va foydali, u qiymatni tegishli turga o'giradi.

Xulosa