javascriptOptional chainingدسترسی اختیاری با ?. در جاوااسکریپت
با ?. در جاوااسکریپت ویژگی اختیاری را بخوانید؛ توقف روی null و undefined، ترکیب با ?? و محدودیت این ابزار در اعتبارسنجی داده را بشناسید.
مفهوم به زبان ساده
فرض کنید آدرس کاربر اختیاری است و میخواهید نام شهر را نشان دهید. خواندن profile.address.city وقتی address وجود ندارد خطا میدهد. با ?. میتوان در همان نقطهٔ اختیاری توقف کرد: اگر مقدار پیش از آن null یا undefined باشد، نتیجهٔ ادامهٔ آن زنجیره undefined میشود. این رفتار به معنی ساختن خودکار آدرس یا معتبرشدن دادهٔ دریافتشده نیست.
در نمونه، یکی از نمایهها آدرس دارد و دیگری ندارد. ترکیب دسترسی اختیاری با ?? برای حالت نبودن، یک متن پیشفرض میسازد. برای دسترسی با نام پویا میتوان obj?.[key] و برای فراخوانی اختیاری تابع func?.() نوشت. اگر ویژگی موجود ولی تابع نباشد، شکل فراخوانی همچنان میتواند خطا بدهد؛ نام «اختیاری» تضمین همهٔ انواع و قراردادها نیست.
متغیر ریشه باید تعریف شده باشد و زنجیره را در محل درست اختیاری کنید. profile?.address.city فقط نبودن خود profile را پوشش میدهد و برای address ناموجود همیشه کافی نیست. همچنین پرانتزگذاری بخشی از زنجیره ممکن است ادامهٔ کوتاهمدار را قطع کند. از این ابزار برای دادهٔ واقعاً اختیاری استفاده کنید؛ نبود فیلد اجباری باید علت روشن و پیام قابل تشخیص داشته باشد.
کجا به کار میآید؟
- نمایش امن ویژگی اختیاری در نمایه یا پاسخ API
- تعیین متن پیشفرض برای دادهای که طبق قرارداد میتواند موجود نباشد
از تعریف تا یک مثال واقعی
const firstProfile = { address: { city: 'رشت' } };
const secondProfile = {};
console.log(firstProfile.address?.city);
console.log(secondProfile.address?.city);
console.log(secondProfile.address?.city ?? 'شهر ثبت نشده');
const absentProfile = null;
console.log(absentProfile?.address?.city ?? 'نمایه موجود نیست');
رشت undefined شهر ثبت نشده نمایه موجود نیست
این مثال چطور کار میکند؟
نمایهٔ نخست شهر دارد و نام آن خوانده میشود.
در نمایهٔ دوم، نبود address به undefined میرسد.
?? برای همان نبودن، متن مناسب انتخاب میکند و نمایهٔ null نیز مدیریت میشود.
اشتباه رایج
?. روی نام ریشهای که اصلاً تعریف نشده، راه نجات عمومی نیست. همچنین آن را بیرویه برای پنهانکردن نبود فیلدهای اجباری به کار نبرید.
این را به خاطر بسپارید
?. مسیر اختیاری را کوتاه میکند؛ ?? میتواند برای نتیجهٔ ناموجود پیشفرض بگذارد، ولی اعتبارسنجی همچنان جداست.