javascriptNullish coalescingمقدار پیشفرض با ?? در جاوااسکریپت
عملگر ?? در جاوااسکریپت فقط برای null و undefined مقدار پیشفرض میگذارد؛ حفظ صفر، false و رشتهٔ خالی را با تنظیمات تعداد نتیجه مقایسه کنید.
مفهوم به زبان ساده
همیشه نمیخواهیم همهٔ مقدارهای falsy را «نداشتن داده» بدانیم. در تنظیمات یک برنامه، صفر ممکن است یعنی هیچ اعلان تازهای نمایش داده نشود و false ممکن است انتخاب آگاهانهٔ کاربر باشد. عملگر ?? سمت راست را فقط زمانی انتخاب میکند که سمت چپ null یا undefined باشد. در غیر این صورت، همان مقدار سمت چپ را نگه میدارد.
این قرارداد با || فرق دارد. استفاده از count || 10 میتواند صفر معتبر را با ده عوض کند. count ?? 10 این کار را نمیکند؛ ولی اگر صفر طبق محصول نامجاز است، نگهداشتن آن هم جای اعتبارسنجی را نمیگیرد. همچنین ?? برای NaN مقدار جایگزین انتخاب نمیکند، زیرا NaN نه null است و نه undefined. نبودن، خراببودن و نامجازبودن سه وضعیت یکسان نیستند.
در نمونه، دو کاربر صفر و null را بهعنوان تنظیم نمونه دارند. یکی انتخابی موجود دارد و دیگری نیازمند پیشفرض است. سمت راست فقط در صورت نیاز ارزیابی میشود. هنگام ترکیب مستقیم ?? با && یا ||، پرانتز لازم است تا نحو مجاز و منظور روشن باشد. برای تنظیمات مهم، معنی هر حالت را پیش از انتخاب عملگر بنویسید.
کجا به کار میآید؟
- حفظ تنظیم معتبر صفر یا false هنگام تعیین پیشفرض
- تفکیک دادهٔ موجود از فیلد اختیاریِ null یا undefined
از تعریف تا یک مثال واقعی
const chosenCount = 0;
const missingCount = null;
console.log(chosenCount ?? 10);
console.log(chosenCount || 10);
console.log(missingCount ?? 10);
console.log(false ?? true);
console.log('' ?? 'مهمان');
console.log(Number.isNaN(NaN ?? 10));
0 10 10 false true
این مثال چطور کار میکند؟
صفر با ?? حفظ و با || کنار گذاشته میشود.
null به مقدار پیشفرض ده میرسد.
false و رشتهٔ خالی حفظ میشوند؛ NaN نیز خودکار اصلاح نمیشود.
اشتباه رایج
?? ابزار بررسی خالیبودن متن یا صحت عدد نیست. رشتهٔ فقط شامل فاصله و NaN را میگذارد؛ قرارداد آن فقط تشخیص null و undefined است.
این را به خاطر بسپارید
پیشفرض را بر اساس معنای نبودن انتخاب کنید؛ ?? صفر، false و متن خالی را دادهٔ موجود میداند.