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:
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:
- Agar
valueโundefinedyokinullbo'lsa โundefinedqaytaradi va davom etmaydi; - Aks holda โ oddiygina
value.prop'ni qaytaradi.
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:
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:
?.[] โ kvadrat qavs bilan
Xossaga nuqta emas, kvadrat qavs orqali murojaat qilinsa, ?.[] ishlatiladi:
?. 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
obj?.propโobjnull/undefinedbo'lsaundefined, aks holdaobj.prop;obj?.[key]vaobj?.()โ kvadrat qavs va funksiya chaqiruvi uchun variantlar;?.chap qisminull/undefinedbo'lsa, zanjir darhol to'xtaydi (short-circuit);?.'ni ortiqcha ishlatmang โ faqat yo'qligi normal bo'lgan joyda;- Chap qismidagi o'zgaruvchi baribir e'lon qilingan bo'lishi kerak.