javascriptNaN and finite numbersNaN و عدد متناهی در جاوااسکریپت
NaN و Infinity در جاوااسکریپت چه معنایی دارند؟ با Number.isNaN و Number.isFinite نتیجهٔ تبدیل و تقسیم را بررسی کنید و عدد بودن را کافی ندانید.
مفهوم به زبان ساده
پس از تبدیل متن یا یک محاسبه، ممکن است مقداری داشته باشید که typeof آن number است، اما برای نمایش قیمت یا تعداد مناسب نیست. NaN نتیجهٔ بعضی عملیات عددی ناموفق را نشان میدهد. Infinity و مقدار منفی آن هم در نوع number قرار میگیرند. پس بررسی نوع، فقط مرحلهٔ نخست اعتبارسنجی است و مجازبودن مقدار در مسئله را تعیین نمیکند.
Number.isNaN فقط خود مقدار NaN را تشخیص میدهد و ورودی را پیش از بررسی به عدد تبدیل نمیکند. مقایسهٔ value === NaN جواب تشخیصی مناسبی نمیدهد، چون NaN با خودش هم برابر نیست. Number.isFinite وقتی true میدهد که ورودی از نوع number و متناهی باشد؛ بنابراین رشتهٔ '25'، NaN و Infinity را رد میکند. این نامهای دقیق را با شکلهای سراسریِ دارای تبدیل ضمنی اشتباه نگیرید.
در نمونه، تقسیم هزینهٔ کل بر تعداد صفر نتیجهٔ نامناسبی برای مدل ما میسازد. تشخیص نتیجه لازم است، اما بهتر است قرارداد تعداد مثبت را پیش از تقسیم هم بررسی کنیم. عدد متناهی هنوز میتواند منفی، اعشاری یا خارج از محدودهٔ مجاز باشد. انتخاب بررسی بعدی به معنای قیمت، نمره، دما یا دادهٔ دیگر بستگی دارد.
کجا به کار میآید؟
- بررسی نتیجهٔ تبدیل ورودی یا محاسبه پیش از پذیرش در مدل
- جلوگیری از نمایش Infinity یا NaN بهجای مبلغ قابل استفاده
از تعریف تا یک مثال واقعی
const invalid = Number('کتاب');
const unitCost = 120000 / 0;
console.log(typeof invalid);
console.log(Number.isNaN(invalid));
console.log(Number.isFinite(unitCost));
console.log(Number.isFinite('25'));
console.log(Number.isFinite(25));
number true false false true
این مثال چطور کار میکند؟
متن غیرعددی به NaN تبدیل میشود، ولی typeof همچنان number است.
Number.isNaN همان نتیجهٔ خراب را تشخیص میدهد.
isFinite بین عدد متناهی، نتیجهٔ تقسیم بر صفر و رشته تمایز میگذارد.
اشتباه رایج
Number.isFinite مقدار را به عدد تبدیل نمیکند؛ اگر مرز شما متن فرم است، تبدیل و بررسی آن را جدا طراحی کنید. متناهیبودن هم صحیح یا مثبتبودن را تضمین نمیکند.
این را به خاطر بسپارید
نوع number کافی نیست؛ نتیجه را از نظر NaN، نامتناهیبودن و محدودیت واقعی مسئله بررسی کنید.