Ichma-ich obyektlarga xavfsiz murojaat (?.), dinamik xususiyatlar va metodlar chaqiruvi, Nullish Coalescing (??) vs OR (||) farqi hamda amaliy qo'llanish.
Chapter 3'da bu ikki operatorni yuzaki ko'rgan edik. Bu bobda ularni chuqur, amaliy misollar bilan, va ular yechadigan haqiqiy muammoni to'liq tushunish uchun o'rganamiz.
Ko'p qavatli (nested) object'lardan ma'lumot olishga urinish — agar oraliq qiymatlardan biri undefined/null bo'lsa, dasturni "yiqitib" qo'yishi mumkin.
script.jsJavaScriptlet user = {name: "Ali",address: {city: "Toshkent"}};console.log(user.address.city); // "Toshkent" — ishlaydiconsole.log(user.contact.phone); // ❌ TypeError: Cannot read properties of undefined
Nima uchun bunday bo'ladi? userda contact propertysi umuman mavjud emas (undefined). undefined.phonega murojaat qilish — xatolikka olib keladi, chunki undefinedning hech qanday propertysi yo'q.
script.jsJavaScriptif (user && user.contact && user.contact.phone) {console.log(user.contact.phone);}
Muammo: Bu — juda uzun, va agar zanjir uzunroq bo'lsa (masalan, 5-6 qavat), kod o'qish qiyin bo'lib qoladi.
?. — agar chapdagi qiymat null yoki undefined bo'lsa, xatolik berish o'rniga, darhol undefined qaytaradi va zanjirni "xavfsiz to'xtatadi".
script.jsJavaScriptlet user = {name: "Ali",address: {city: "Toshkent"}};console.log(user.contact?.phone); // undefined (xatolik yo'q!)console.log(user.address?.city); // "Toshkent"
code.textTEXTuser.contact?.phone│▼user.contact — bu undefined│▼ ?. buni ko'radi va DARHOL to'xtaydiundefined qaytariladi (xatolik EMAS)
?. — har safar "keyingi qadamga o'tishdan oldin" chap tomon null/undefined emasligini tekshiradi. Agar shunday bo'lsa, butun ifoda darhol undefinedga aylanadi, qolgan zanjir "bajarilmaydi" (hisoblanmaydi).
script.jsJavaScriptlet user = {name: "Ali",greet: function () {return "Salom!";}};console.log(user.greet?.()); // "Salom!" — metod mavjudconsole.log(user.sayBye?.()); // undefined — metod mavjud emas, XATOLIK YO'Q
Explanation
user.sayBye?.() — agar sayBye mavjud bo'lmasa, uni chaqirishga hatto urinib ham ko'rmaydi, to'g'ridan-to'g'ri undefined qaytaradi. Bu — Chapter 6'da o'rgangan "mavjud bo'lmagan functionni chaqirish — xatolik beradi" qoidasidan xavfsiz qochish usuli.
script.jsJavaScriptlet users = null;console.log(users?.[0]); // undefined, xatolik yo'q
| Sintaksis | Qachon ishlatiladi |
|---|---|
obj?.prop | Object propertysiga xavfsiz murojaat |
obj?.[expr] | Dinamik (bracket notation) propertyga xavfsiz murojaat |
obj?.method() | Metodni xavfsiz chaqirish |
🔥 Important
?. — faqat chap tomonni tekshiradi. Agar userning o'zi null bo'lsa-yu, siz user.address.city deb yozsangiz (birinchi ?.siz), baribir xatolik chiqadi. Zanjirning har bir potentsial xavfli nuqtasida ?. qo'yish kerak: user?.address?.city.
?? — chap tomondagi qiymat faqat null yoki undefined bo'lsa, o'ng tomondagi "zaxira" qiymatni qaytaradi.
script.jsJavaScriptlet username = null;let displayName = username ?? "Mehmon";console.log(displayName); // "Mehmon"
Bu — Chapter 3'da yuzaki tegib o'tilgan, lekin juda muhim farq: || (OR) — barcha falsy qiymatlarni (Chapter 4.4: 0, "", false, null, undefined, NaN) "yomon" deb hisoblaydi, ?? esa faqat null/undefinedni.
script.jsJavaScriptlet count = 0;let quantity = count || 10;console.log(quantity); // 10 — LEKIN bu noto'g'ri natija!
Nima uchun bu xato? Dasturchi countning haqiqiy qiymati 0 ekanligini saqlab qolmoqchi edi (0 — to'g'ri, mazmunli qiymat, "yo'qlik" emas). Lekin || — 0ni falsy deb hisoblab, uni "yo'q" deb qabul qildi va 10ni ishlatdi.
script.jsJavaScriptlet count = 0;let quantity = count ?? 10;console.log(quantity); // 0 — to'g'ri natija!
?? — 0ni falsy emas, balki mavjud, mazmunli qiymat deb hisoblaydi. U faqat null/undefined bo'lgandagina "zaxira" qiymatni ishlatadi.
| Qiymat | value || "default" natijasi | value ?? "default" natijasi |
|---|---|---|
0 | "default" (❌ noto'g'ri bo'lishi mumkin) | 0 (✅ to'g'ri) |
"" | "default" (❌ noto'g'ri bo'lishi mumkin) | "" (✅ to'g'ri) |
false | "default" (❌ noto'g'ri bo'lishi mumkin) | false (✅ to'g'ri) |
null | "default" | "default" |
undefined | "default" | "default" |
💡 Key Idea
Qoida: agar 0, "", false kabi qiymatlar haqiqiy va to'g'ri natija bo'lishi mumkin bo'lsa (masalan, hisoblagich, forma maydoni, checkbox holati), har doim ?? ishlating. ||ni faqat "har qanday falsy qiymat noto'g'ri" degan holatlarda ishlating.
script.jsJavaScriptlet config = {settings: {theme: null}};let theme = config.settings?.theme ?? "light";let fontSize = config.settings?.fontSize ?? 14;console.log(theme); // "light" (theme null edi)console.log(fontSize); // 14 (fontSize umuman mavjud emas edi)
?. — xavfsiz "sayohat qilish" uchun, ?? — agar oxirida natija null/undefined bo'lsa, mos default qiymat berish uchun. Bu ikkisi birgalikda — real loyihalarda konfiguratsiya, API javoblari bilan ishlashda juda ko'p ishlatiladi.
Task:
user object'ida address propertysi bo'lmasligi mumkin. ?. yordamida user.address?.streetga xavfsiz murojaat qiling.
Required Concepts:
console.log(user.address?.street);Task:
Foydalanuvchi berilgan discount qiymati 0 bo'lishi mumkin (bu — "chegirma yo'q" degani, to'g'ri qiymat). ?? yordamida, agar discount null/undefined bo'lsagina, uni 5 (default chegirma) bilan almashtiring; 0 bo'lsa, 0 bo'lib qolsin.
Required Concepts:
||let finalDiscount = discount ?? 5;Task:
Murakkab, ko'p qavatli API javobini simulyatsiya qiling: response.data?.user?.profile?.avatar?.url ?? "default-avatar.png". Turli holatlar uchun (data yo'q, user yo'q, hammasi bor) sinab ko'ring va natijalarni solishtiring.
Required Concepts:
script.jsJavaScriptlet settings = {volume: 0,brightness: null};console.log(settings.volume || 50);console.log(settings.volume ?? 50);console.log(settings.brightness || 80);console.log(settings.brightness ?? 80);
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> 50 0 80 80Why?
volume: 0 — || uni falsy deb hisoblab, 50ni beradi (noto'g'ri natija). ?? esa 0ni to'g'ri qiymat deb hisoblab, 0ni qoldiradi. brightness: null uchun — ikkalasi ham (|| va ??) nullni "yo'q" deb hisoblab, 80ni beradi (bu holatda ikkalasi bir xil natija beradi, chunki null — ham falsy, ham nullish).
Quyidagi kodda muammo bor:
script.jsJavaScriptfunction createUser(name, age) {let finalAge = age || 18;return { name, age: finalAge };}let user = createUser("Ali", 0); // Yangi tug'ilgan chaqaloq, yosh = 0console.log(user.age); // dasturchi 0 kutgan, lekin 18 chiqmoqda
Your Task:
Yechim:
</details>script.jsJavaScriptfunction createUser(name, age) {let finalAge = age ?? 18;return { name, age: finalAge };}let user = createUser("Ali", 0);console.log(user.age); // 0 — to'g'ri
?.) — nested object'larga xatolik xavfisiz murojaat qilish imkonini beradi.?. — object property, dinamik property, va metod chaqiruvlari uchun ishlatilishi mumkin.??) — faqat null/undefined uchun default qiymat beradi.?? va || orasidagi asosiy farq — 0, "", false kabi "to'g'ri, lekin falsy" qiymatlarga munosabat.?. — zanjirning istalgan nuqtasida null/undefined uchrasa, xavfsiz "to'xtaydi".|| emas ?? ishlating.?.() — metod mavjudligini oldindan tekshirmasdan, xavfsiz chaqirish imkonini beradi.?. faqat chap tomonni tekshiradi — zanjirning har bir xavfli bo'g'inida alohida qo'yilishi kerak.script.jsJavaScriptobj?.prop; // xavfsiz propertyobj?.[dynamicKey]; // xavfsiz dinamik propertyobj?.method?.(); // xavfsiz metod chaqiruvivalue ?? "default"; // faqat null/undefined uchun defaultvalue || "default"; // barcha falsy qiymatlar uchun default (ehtiyot bo'ling!)
Mavzu bo‘yicha tushunchalaringizni interaktiv test orqali sinovdan o‘tkazing va natijalarni bilib oling.
Darslikda o‘rganilgan qoidalarga asosan real kod yozing, testlardan o‘tkazing va yechimlarni mustahkamlang.
Test Sinovi
Hali topshirilmagan (kamida 75% kerak)
Amaliy Masalalar
0 / 3 ta yechildi (kamida 75% kerak)
Dars sifati va mazmunini yaxshilash uchun o‘z haqqoniy bahoingizni qoldiring.
Mavzuni to‘liq o‘zlashtirish uchun test sinovi, amaliy kodlash va bog‘liq darslar
O‘z bilimingizni interaktiv test savollari orqali tekshiring va darhol xatolarni tahlil qiling.
Nazariyani real kod yozish bilan mustahkamlang, avtomatik testlardan o‘ting va XP to‘plang.
Kurs bo‘yicha keyingi va bog‘liq mavzular: