مقادیر NaN در جاوا اسکریپت — به زبان ساده

۱۶۱۳ بازدید
آخرین به‌روزرسانی: ۰۷ شهریور ۱۴۰۲
زمان مطالعه: ۳ دقیقه
مقادیر NaN در جاوا اسکریپت — به زبان ساده

در جاوا اسکریپت یک مقدار خاص به نام NaN به معنی «not a number» وجود دارد که برای نشان دادن این که نتیجه یک محاسبه ریاضیاتی قابل نمایش نیست مورد استفاده قرار می‌گیرد. مقادیر NaN در جاوا اسکریپت زمانی ظاهر می‌شود که تابع‌های Math ناموفق باشند. به مثال زیر توجه کنید:

997696
1Math.sqrt(-37)

همچنین هنگامی که تابعی تلاش کند یک عدد را تجزیه کند با شکست مواجه می‌شود:

1parseInt("No integers here")

NaN موجب مسموم شدن همه تابع‌های ریاضیاتی دیگر می‌شود و در نهایت همه عملیات ریاضیاتی دیگر منجر به NaN می‌شوند:

1let failedMath = Math.sqrt(-37);
2console.log(failedMath); // NaN
3console.log(3 + failedMath); // NaN
4
5let failedStringParse = parseInt("Operation Doomsday", 10);
6console.log(failedStringParse); // NaN
7console.log(3 * failedStringParse); // NaN

تقسیم بر صفر

توجه داشته باشید که تقسیم بر صفر در جاوا اسکریپت، موجب بازگشت مقدار Infinity و نه NaN می‌شود:

1let divisionByZero = 37 / 0;
2console.log(divisionByZero); // Infinity
3
4let divisionByEmptyString = 37 / "";
5console.log(divisionByEmptyString); // Infinity
6
7let divisionByFalsy = 37 / false;
8console.log(divisionByFalsy); // Infinity
9
10let zeroOverZero = 0 / 0;
11console.log(zeroOverZero); // NaN

دلیل این نتیجه به شیوه تعریف عددهای اعشاری در جاوا اسکریپت و به طور کلی‌تر در رایانه باز می‌گردد. به بیان خلاصه 1/0 همان حد 1/x است وقتی که x به صفر میل می‌کند. بنابراین 0/0 هیچ میان‌یابی معقولی ندارد و از این رو NaN است.

NaN کلاً به چه معنا است؟

NaN یک مشخصه شیء سراسری است.

مقدار اولیه NaN به صورت Not-A-Number است.

مقادیر NaN

پیچیدگی در بررسی NaN

متأسفانه در هنگام بررسی NaN دو مشکل وجود دارد:

  1. type of NaN به صورت Number است.
  2. NaN با همه مقادیر دیگر در جاوا اسکریپت نابرابر است.

به مثال زیر توجه کنید:

1let myNaN = NaN; // or let myNan = Number.NaN
2console.log(typeof myNaN); // "number"
3console.log(myNaN == NaN); // false
4console.log(myNaN === NaN); // false

اکنون سؤال این است که چگونه می‌توانیم بررسی کنیم یک مقدار NaN داریم که عملیات ریاضی را مختل کرده است؟

بررسی NaN از طریق برابری با خود

چنان که پیش‌تر اشاره کردیم، تنها و تنها NaN است که با خودش برابر نیست. در جاوا اسکریپت بهترین روش برای بررسی NaN بودن یک مقدار بررسی برابری آن با خود (self-equality) است.

از آنجا که NaN با خودش برابر نیست، NaN!= NaN همواره مقدار صحیح تولید می‌کند. البته این روش تست مقدار NaN در کد همواره خوانا نیست، بنابراین استفاده از یک کامنت یا ایجاد یک تابع پوششی ایده خوبی به نظر می‌رسد:

1let variable = NaN; // or let variable = Number.NaN
2
3// Check for NaN by checking for self-equality
4console.log(variable != variable); // true
5console.log(variable !== variable); // true
6
7// NaN is the only value that is not equal to itself
8let isNaN = (maybeNaN) => maybeNaN!=maybeNaN;
9console.log(isNaN(variable)); // true

نکاتی در مورد ()Number.isNan

جاوا اسکریپت مدرن یک پیاده‌سازی برای بررسی NaN بودن مقدار به نام Number.isNan()‎ دارد که مطابق انتظار عمل می‌کند. به مثال زیر توجه کنید:

1let maybeNaN = NaN;
2console.log(Number.isNaN(maybeNaN)); // true
3
4maybeNaN = 3;
5console.log(Number.isNaN(maybeNaN)); // false

توجه داشته باشید که ()Number.isNaN از تابع ()isNaN متفاوت است. ()isNaN یک پیاده‌سازی قدیمی‌تر است که هدف اصلی آن بررسی این است که آیا یک مقدار می‌تواند به صورت عددی درآید یا نه. به توضیحات تکمیلی زیر توجه کنید:

در صورتی که مقدار در حال حاضر NaN باشد، یا اگر قرار باشد پس از کاهش یافتن به عدد، به صورت NaN درآید، ()isNaN مقدار صحیح بازگشت می‌دهد. به بیان دیگر اگر مقداری دریافت کند که می‌تواند به یک عدد کاهش یابد، ()isNaN مقدار true بازگشت خواهد داد.

()Number.isNaN تنها در صورتی مقدار true بازگشت می‌دهد که مقدار در حال حاضر NaN باشد.

1isNaN('hello world');        // true
2Number.isNaN('hello world'); // false

بنابراین اگر از مرورگرهای قدیمی (به خصوص اینترنت اکسپلورر) پشتیبانی می‌کنید که ()Number.isNaN در آن‌ها وجود ندارد، در این صورت بهترین گزینه «بررسی با خود» (self-equality) است.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۴ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
coding-in-simple-english
۳ دیدگاه برای «مقادیر NaN در جاوا اسکریپت — به زبان ساده»

خیلی ممنونم از اینکه مطالبتون رو واضحتوضیح دادید

سلام.من از صرافی رمز ارزی به کیف پول تراست ارسال کردم،تایید تراکنش اومد،کارمزد تراکنش هم کم شد اما ارز مورد نظر قیمت ندارد و به مبلغ کل اضافه نشده و در آخر اطلاعات نوشته Nonce 5164136,لطفا اگر میتونید کمکم کنید که این به چه معناست و چه خواهد شد ؟

از آقای لطفی خیلی ممنونم چون واقعا مطالبشون کمک کننده است!

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *