Xossalarga murojaat qilish ifodalari
Xossaga murojaat qilish ifodasi (Property access expression) obyekt xossasining yoki massiv elementining qiymatini ifodalaydi. JavaScript xossaga murojaat qilish uchun ikki xil sintaksisni taqdim etadi:
Birinchi uslubdagi xossaga murojaat ifodasi, biror ifodadan keyin keladigan nuqta va identifikator ko‘rinishida bo‘ladi. Birinchi ifoda obyektni, identifikator esa kerakli xossaning nomini belgilaydi. Ikkinchi uslubdagi xossaga murojaatda esa, birinchi ifodadan (obyekt yoki massivdan) keyin kvadrat qavslar ichida yana bir ifoda keladi. Bu ikkinchi ifoda kerakli xossaning nomini yoki kerakli massiv elementining indeksini belgilaydi.
Quyida bir nechta aniq misollar keltirilgan:
Xossaga murojaat qilish ifodasining har ikki turida ham, .
yoki [
belgisidan oldingi ifoda birinchi bo‘lib bajariladi. Agar bu ifodaning qiymati null
yoki undefined
bo‘lsa, ifoda TypeError
xatoligiga sabab bo‘ladi, chunki bu ikki JavaScript qiymati xossalarga ega bo‘la olmaydi.
Agar obyekt ifodasidan keyin nuqta va identifikator kelsa, o‘sha identifikator bilan nomlangan xossaning qiymati qidiriladi va u butun ifodaning yakuniy qiymatiga aylanadi. Agar obyekt ifodasidan keyin kvadrat qavslar ichida boshqa bir ifoda kelsa, o‘sha ikkinchi ifoda bajariladi va satrga o‘zgartiriladi. Shundan so‘ng, butun ifodaning yakuniy qiymati o‘sha satr bilan nomlangan xossaning qiymati bo‘ladi. Har ikki holatda ham, agar nomlangan xossa mavjud bo‘lmasa, xossaga murojaat qilish ifodasining qiymati undefined
bo‘ladi.
.identifikator
sintaksisi xossaga murojaat qilishning ikki variantidan soddarog‘idir, lekin e’tibor bering, u faqat siz murojaat qilmoqchi bo‘lgan xossaning nomi ruxsat etilgan identifikator bo‘lganda va siz dasturni yozayotganda bu nomni bilganingizdagina ishlatilishi mumkin. Agar xossa nomi bo‘shliqlar yoki tinish belgilarini o‘z ichiga olsa, yoki u son bo‘lsa (massivlar uchun), siz kvadrat qavslar yozuvidan foydalanishingiz shart. Kvadrat qavslar, shuningdek, xossa nomi statik bo‘lmay, o‘zi ham biror hisob-kitob natijasi bo‘lganda ishlatiladi (misol uchun §6.3.1-bo‘limga qarang).
Obyektlar va ularning xossalari 6-bobda, massivlar va ularning elementlari esa 7-bobda batafsil yoritilgan.
Shartli xossa murojaati (Conditional property access)
ES2020 xossaga murojaat qilish ifodalarining ikki yangi turini qo‘shdi:
JavaScript'da null
va undefined
qiymatlari xossalarga ega bo‘lmagan yagona ikki qiymatdir. .
yoki []
yordamidagi oddiy xossa murojaati ifodasida, agar chap tomondagi ifoda null
yoki undefined
'ga baholansa, siz TypeError
xatoligiga duch kelasiz. ?.
va ?.[]
sintaksisidan aynan shu turdagi xatoliklardan himoyalanish uchun foydalanishingiz mumkin.
a?.b
ifodasini ko‘rib chiqaylik. Agar a
qiymati null
yoki undefined
bo‘lsa, u holda ifoda b
xossasiga murojaat qilishga hech qanday urinishsiz undefined
'ga baholanadi. Agar a
boshqa biror qiymat bo‘lsa, u holda a?.b
ifodasi a.b
ifodasi qanday qiymatga baholansa, o‘sha qiymatga baholanadi (va agar a
'da b
nomli xossa bo‘lmasa, qiymat yana undefined
bo‘ladi).
Xossaga murojaat qilishning bu shakli ba’zan "ixtiyoriy zanjir" (optional chaining
) deb ataladi, chunki u quyidagiga o‘xshash uzunroq, "zanjirsimon" xossa murojaati ifodalari uchun ham ishlaydi:
a
— bu obyekt, shuning uchun a.b
to‘g‘ri xossa murojaati ifodasidir. Lekin a.b
'ning qiymati null
, shuning uchun a.b.c
qiymatini olish TypeError
xatoligiga sabab bo‘ladi. .
o‘rniga ?.
'dan foydalanib, TypeError
'ni oldini olamiz va a.b?.c
qiymati undefined
'ga baholanadi. Bu degani, (a.b?.c).d
qiymati TypeError
xatoligiga sabab bo‘ladi, chunki bu ifoda undefined
qiymatining xossasiga murojaat qilishga harakat qiladi. Lekin — bu "ixtiyoriy zanjir"ning juda muhim qismi — a.b?.c.d
(qavslarsiz) shunchaki undefined
'ga baholanadi va xatolik yuzaga keltirmaydi. Buning sababi, ?.
bilan xossaga murojaat qilish **"qisqa tutashuvli" (short-circuiting
)**dir: agar ?.
'dan chapdagi quyi ifoda null
yoki undefined
'ga baholansa, butun ifoda darhol, keyingi xossalarga murojaat qilishga urinmasdan undefined
'ga baholanadi.
Albatta, agar a.b
obyekt bo‘lsa va bu obyektda c
nomli xossa bo‘lmasa, u holda a.b?.c.d
yana TypeError
xatoligiga sabab bo‘ladi va biz yana bir shartli xossa murojaatidan foydalanmoqchi bo'lamiz:
Shartli xossa murojaatini []
o‘rniga ?.[]
yordamida amalga oshirish mumkin. a?.[b][c]
ifodasida, agar a
'ning qiymati null
yoki undefined
bo‘lsa, butun ifoda darhol undefined
'ga baholanadi va b
hamda c
quyi ifodalari umuman bajarilmaydi. Agar bu ifodalarning birortasida qo‘shimcha ta’sir (side effect
) bo‘lsa, a
aniqlanmagan taqdirda bu qo‘shimcha ta’sir yuz bermaydi:
?.
va ?.[]
bilan shartli xossa murojaati JavaScript'ning eng yangi xususiyatlaridan biridir. 2020-yil boshiga kelib, bu yangi sintaksis ko‘pchilik asosiy brauzerlarning joriy yoki beta versiyalarida qo‘llab-quvvatlanadi.