Obyektlar: asoslar

Optional chaining ?.

Optional chaining (ixtiyoriy zanjir) ?. โ€” obyekt xossalariga xavfsiz murojaat qilishning zamonaviy usuli. Agar oraliq xossa mavjud bo'lmasa, xato o'rniga undefined qaytadi.

"Mavjud emas" muammosi

Aytaylik, ba'zi foydalanuvchilarning manzili bor, ba'zilarniki yo'q. Manzilning ko'chasini o'qimoqchi bo'lsak:

muammo.js
// natija shu yerda chiqadi

user.address โ€” undefined, uning street xossasini o'qishga urinish TypeError xatosini beradi. Ko'p hollarda bu yerda xato emas, balki undefined natija kerak.

Eski usulda buni && yoki shartli operatorlar bilan tekshirar edik โ€” bu esa uzun va noqulay kod edi:

console.log( user.address ? user.address.street : undefined );

// yoki juda uzun zanjirda:
console.log(
  user.address && user.address.street && user.address.street.name
);

Optional chaining ?.

?. operatori muammoni oson hal qiladi. value?.prop quyidagicha ishlaydi:

optional.js
// natija shu yerda chiqadi

Ko'ryapmizki, kod qisqa, aniq va xatosiz. user?.address undefined bo'lgani sababli, undan keyingi ?.street ham to'xtab, undefined qaytardi.

?. faqat o'zining chap tomonidagi qiymatni tekshiradi, undan oldingisini emas. user?.address?.street'da user'ning o'zi e'lon qilinmagan bo'lsa xato bo'ladi โ€” ?. mavjud bo'lmagan o'zgaruvchilarni himoya qilmaydi.

Qisqa tutashuv (short-circuit)

?. chap qismi null/undefined bo'lsa, hisoblashni darhol to'xtatadi. Zanjirning qolgan qismidagi funksiya chaqiruvlari ham bajarilmaydi:

short-circuit.js
// natija shu yerda chiqadi

Boshqa variantlar: ?.() va ?.[]

?. โ€” operator emas, balki uch xil sintaktik shakli bor maxsus konstruksiya. U xossa uchun, funksiya chaqiruvi uchun va kvadrat qavs uchun ishlaydi.

?.() โ€” metod bor-yo'qligini tekshirish

Obyektning ba'zi metodlari bo'lishi mumkin, ba'zilarida yo'q. ?.() metod mavjud bo'lsagina chaqiradi:

metod.js
// natija shu yerda chiqadi

?.[] โ€” kvadrat qavs bilan

Xossaga nuqta emas, kvadrat qavs orqali murojaat qilinsa, ?.[] ishlatiladi:

qavs.js
// natija shu yerda chiqadi

?. o'chirish (delete) bilan ham ishlaydi: delete user?.name โ€” user mavjud bo'lsagina name'ni o'chiradi.

Qachon ISHLATILMAYDI?

?.'dan haddan tashqari foydalanmang! Uni faqat qiymatning mavjud bo'lmasligi normal bo'lgan joylarda ishlating. Agar user mantiqan albatta bo'lishi kerak bo'lsa, uni user?.address deb yozish xatolarni yashirib qo'yadi va debug qilishni qiyinlashtiradi.

Yana bir muhim cheklov: ?.'ning chap qismidagi o'zgaruvchi e'lon qilingan bo'lishi shart (let/const/var yoki funksiya parametri). E'lon qilinmagan o'zgaruvchi uchun ?. yordam bermaydi.

Shuningdek, ?. faqat o'qish va chaqirish uchun. Uning chap qismiga qiymat yozib bo'lmaydi:

// Bunday yozib bo'lmaydi:
user?.name = "Yangi";  // XATO โ€” chap tomonda ?. yozilmaydi

Xulosa