مقادیر NaN در جاوا اسکریپت — به زبان ساده
در جاوا اسکریپت یک مقدار خاص به نام NaN به معنی «not a number» وجود دارد که برای نشان دادن این که نتیجه یک محاسبه ریاضیاتی قابل نمایش نیست مورد استفاده قرار میگیرد. مقادیر NaN در جاوا اسکریپت زمانی ظاهر میشود که تابعهای Math ناموفق باشند. به مثال زیر توجه کنید:
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 دو مشکل وجود دارد:
- type of NaN به صورت Number است.
- 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) است.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای JavaScript (جاوا اسکریپت)
- آموزش JavaScript ES6 (جاوا اسکریپت)
- مجموعه آموزشهای برنامهنویسی
- Timeout و Interval در جاوا اسکریپت ناهمگام — راهنمای کاربردی
- ۱۱ ترفند بسیار کاربردی جاوا اسکریپت — به زبان ساده
- حلقه for در جاوا اسکریپت — از صفر تا صد + مثال و کد
==
خیلی ممنونم از اینکه مطالبتون رو واضحتوضیح دادید
سلام.من از صرافی رمز ارزی به کیف پول تراست ارسال کردم،تایید تراکنش اومد،کارمزد تراکنش هم کم شد اما ارز مورد نظر قیمت ندارد و به مبلغ کل اضافه نشده و در آخر اطلاعات نوشته Nonce 5164136,لطفا اگر میتونید کمکم کنید که این به چه معناست و چه خواهد شد ؟
از آقای لطفی خیلی ممنونم چون واقعا مطالبشون کمک کننده است!