Optional Chaining va Nullish Coalescing
Muammodan boshlaylik
Server dan foydalanuvchi ma'lumoti keldi. Lekin ba'zi foydalanuvchilarda manzil to'ldirilmagan.
const foydalanuvchi = {
ism: "Jasur",
manzil: {
shahar: "Toshkent",
tuman: {
nomi: "Yunusobod"
}
}
};
Tumanini olish:
console.log(foydalanuvchi.manzil.tuman.nomi); // "Yunusobod"
Boshqa foydalanuvchida manzil yo'q:
const foydalanuvchi2 = { ism: "Malika" };
console.log(foydalanuvchi2.manzil.tuman.nomi);
// ❌ TypeError: Cannot read properties of undefined (reading 'tuman')
manzil yo'q, manzil.tuman ga murojaat — xato. Eski yechim:
const tuman = foydalanuvchi2.manzil
&& foydalanuvchi2.manzil.tuman
&& foydalanuvchi2.manzil.tuman.nomi;
Bu uzoq va o'qish qiyin. Optional chaining bu muammoni hal qiladi.
Optional Chaining ?.
?. — "oldingi qiymat null yoki undefined bo'lsa, davom etma, undefined qaytar".
const foydalanuvchi2 = { ism: "Malika" };
console.log(foydalanuvchi2?.manzil?.tuman?.nomi); // undefined — xato yo'q ✅
console.log(foydalanuvchi?.manzil?.tuman?.nomi); // "Yunusobod" ✅
Zanjir o'rtasida null/undefined topilsa — u yerda to'xtaydi, xato bermaydi.
foydalanuvchi2?.manzil → undefined (manzil yo'q)
?.tuman → undefined ga murojaat — to'xtadi
?.nomi → bajarilmadi
Natija: undefined
Metod chaqirishda:
const foydalanuvchi = {
salomlash() { return "Salom!"; }
};
console.log(foydalanuvchi.salomlash?.()); // "Salom!"
console.log(foydalanuvchi.xayrlash?.()); // undefined — metod yo'q, xato yo'q
Massiv elementida:
const arr = null;
console.log(arr?.[0]); // undefined — xato yo'q
Nullish Coalescing ??
?? — chap tomon null yoki undefined bo'lsa, o'ng tomoni qaytaradi. Aks holda chap tomon.
const ism = null;
console.log(ism ?? "Noma'lum"); // "Noma'lum"
const yosh = 0;
console.log(yosh ?? 18); // 0 ← yosh aniq 0, "yo'q" emas
?? va || farqi — eng muhim
|| — chap tomon falsy bo'lsa (0, "", false, null, undefined) o'ng tomoni qaytaradi.
?? — chap tomon faqat null yoki undefined bo'lsa o'ng tomoni qaytaradi.
const ball = 0; // ← haqiqiy qiymat, lekin falsy
console.log(ball || 100); // 100 ❌ — 0 ni "yo'q" deb hisoblab, 100 berdi
console.log(ball ?? 100); // 0 ✅ — 0 haqiqiy qiymat, saqlanib qoldi
const ism = "";
console.log(ism || "Mehmon"); // "Mehmon" — bo'sh matn falsy
console.log(ism ?? "Mehmon"); // "" — bo'sh matn null/undefined emas
Qoida: standart qiymat kerak bo'lsa — ??. Agar 0, "", false ham "yo'q" hisoblansa — ||.
Ikkalasini birga ishlatish
const konfiguratsiya = {
server: {
port: 0, // ← aniq 0, standart emas
host: null, // ← belgilanmagan
}
};
const port = konfiguratsiya?.server?.port ?? 3000;
const host = konfiguratsiya?.server?.host ?? "localhost";
console.log(port); // 0 ← ?? 0 ni saqlab qoldi
console.log(host); // "localhost" ← null uchun standart qiymat
Tez-tez uchraydigan xatolar
?. ni keraksiz joyda ishlatish:
// ❌ — foydalanuvchi har doim bor, manzil har doim bor, faqat tuman yo'q bo'lishi mumkin
foydalanuvchi?.manzil?.tuman?.nomi
// ✅ — faqat shubhali joy uchun
foydalanuvchi.manzil.tuman?.nomi
?. ni haddan ko'p ishlatish kodni o'qishni qiyinlashtiradi va haqiqiy xatolarni yashirishi mumkin.
?? o'rniga || — 0 va bo'sh matn yo'qolishi:
// Foydalanuvchi o'z ballini kiritdi: 0
const kiritilgan = 0;
// ❌ — 0 ni "kiritilmagan" deb hisoblab, standart qiymat berdi
const ball = kiritilgan || 50; // 50
// ✅
const ball = kiritilgan ?? 50; // 0
Xulosa
?. — zanjir o'rtasida null/undefined bo'lsa xato bermaydi, undefined qaytaradi.
?? — faqat null/undefined uchun standart qiymat beradi. 0, "", false ga tegmaydi.
|| — falsy qiymatlar (0, "", false) ham standart qiymatga o'tkaziladi. Faqat shu kerak bo'lganda ishlatiladi.
// Odatiy pattern
const qiymat = ob'ekt?.ichki?.xususiyat ?? "standart";
Keyingi dars
26-dars: String metodlari — split, join, trim, replace, includes, startsWith, endsWith, padStart, padEnd