استفاده از شیء Number در جاوا اسکریپت — به زبان ساده
با استفاده از تابع Number و شیئی که میسازد در جاوا اسکریپت کارهای زیادی میتوان انجام داد. شیء Number یک شیء پوششی است که امکان کار با اعداد را فراهم میسازد و ثابتها و متدهای مختلفی را در اختیار ما قرار میدهد. با استفاده از تابع ()Number یک عدد مقدماتی را میتوان ساخت. عدد در جاوا اسکریپت یک مقدار IEEE 754 با قالب باینری 64 بیتی با دقت double است. در این مقاله با روش استفاده از شیء Number جاوا اسکریپت آشنا خواهیم شد.
ایجاد شیء Number
با استفاده از تابع Number میتوانیم یک شیء Number بسازیم.
به مثال زیر توجه کنید:
1new Number('123');
2const a = new Number('123');
3const b = Number('123');
هدف اصلی تابع Number ایجاد یک عدد از روی رشته است. سازنده Number به همراه عملگر new برای ساخت یک شیء Number استفاده میشود که به جای نوع number از نوع object است. یک عدد مقدماتی وهلهای از Number نیست. نوع داده برای مقدار اعداد مقدماتی به صورت number است. این نوع با عملگر typeof و سازنده به دست میآید که از عملگر instanceof ساخته شده و به صورت زیر مورد استفاده قرار میگیرد:
1console.log(typeof new Number('123'));
2console.log(new Number('123') instanceof Number);
نتیجه اجرای دو خط کد فوق به ترتیب نوع object و مقدار true است. از سوی دیگر اگر کد زیر را بنویسیم:
1console.log(typeof Number('123'));
2console.log(Number('123') instanceof Number);
به ترتیب مقادیر number و false را به دست میآوریم.
کاربرد اصلی شیء Number برای بررسی این واقعیت است که آیا شیء میتواند به عدد تبدیل شود یا نه. اگر یک مقدار غیر عددی به تابع Number ارسال شود، مقدار NaN بازگشت خواهد یافت. اگر Number بدون عملگر new در context غیر سازنده استفاده شود، استفاده از تبدیل نوع کارآمد خواهد بود.
شیء Number مشخصههای زیر را دارد:
- Number.EPSILON – کمترین بازه بین دو عدد قابل نمایش.
- Number.MAX_SAFE_INTEGER – بزرگترین عدد صحیح امن در جاوا اسکریپت یعنی 2^53 منهای 1.
- Number.MAX_VALUE – بزرگترین عدد مثبت قابل نمایش یعنی 1.7976931348623157e+308.
- Number.MIN_SAFE_INTEGER – کوچکترین عدد صحیح امن در جاوا اسکریپت یعنی -2⁵³ منهای 1.
- Number.MIN_VALUE – کوچکترین عدد صحیح قابل نمایش یعنی عددی که به قدر کافی به صفر نزدیک است و در عین حال صفر نیست.
- Number.NaN – مقدار غیر عددی.
- Number.NEGATIVE_INFINITY – مقدار نمایشدهنده منفی بینهایت.
- Number.POSITIVE_INFINITY – مقدار نمایشدهنده مثبت بینهایت.
متدهای استاتیک
شیء Number چندین متد استاتیک دارد که در ادامه هر یک را توضیح میدهیم.
متد ()Number.isNaN
این متد تعیین میکند که آیا مقدار NaN است یا نه. این متد در صورتی مقدار true بازگشت میدهد که مقدار NaN باشد. برای نمونه میتوانیم از آن برای تعیین این که آیا یک شیء عدد است یا نه به صورت زیر استفاده کنیم:
1console.log(Number.isNaN(+'abc')); // true
2console.log(Number.isNaN(+'123')); // false
خط اول کد فوق مقدار true را لاگ میکند، زیرا وقتی که 'abc' با عملگر + به عدد تبدیل شود، مقدار NaN به دست میآید. از سوی دیگر خط دوم مقدار false لاگ میکند، زیرا وقتی ‘123’ با استفاده از عملگر + به عدد تبدیل شود، مقدار 123 به دست میآید که یک عدد است و از این رو خط دوم مقدار false را پرینت میکند.
متد ()Number.isFinite
این متد مشخص میسازد که مقدار ارسالی یک عدد متناهی است یا نه. در صورتی که عدد متناهی باشد مقدار true و در غیر این صوت مقدار false بازگشت خواهد یافت. برای نمونه میتوانیم از آن برای تعیین این که یک شیء عدد است یا نه به صورت زیر استفاده کنیم:
1console.log(Number.isFinite(Infinity)); // false
2console.log(Number.isFinite(123)); // true
اجرای کد نخست کد فوق مقدار false به دست میدهد، زیرا Infinity یک عدد متناهی نیست، اما خط دوم مقدار true را لاگ میکند، زیرا 132 یک عدد متناهی است.
متد ()Number.isInteger
این متد تعیین میکند که عدد ارسالی یک عدد صحیح است یا نه. این متد در صورتی که مقدار ورودی، عدد صحیح باشد مقدار true و در غیر این صورت مقدار false بازگشت میدهد. برای نمونه میتوانیم از این متد به صورت کد زیر استفاده کنیم:
1console.log(Number.isInteger(123)); // true
2console.log(Number.isInteger(123.45)); // false
خط نخست کد فوق مقدار true برمیگرداند، زیرا 123 یک عدد صحیح است، اما خط دوم مقدار flase بازگشت میدهد زیرا عدد صحیح نیست. اگر آرگومان ارسالی از نوع عددی نباشد در این صورت مقدار بازگشتی false خواهد بود. برای نمونه ;Number.isInteger('10') مقدار false بازگشت میدهد.
متد ()Number.isSafeInteger
این متد تعیین میکند که عدد صحیح ارسالی در آرگومان در بازه امن اعداد صحیح قرار دارد یا نه. بدین ترتیب اعدادی که در بازه منهای 1 و منهای 1 هستند، مقدار true و در غیر این صورت مقدار false بازگشت میدهند. به مثال زیر توجه کنید:
1console.log(Number.isSafeInteger(Math.pow(2, 53) - 1)); // true
2console.log(Number.isSafeInteger(Math.pow(2, 53))); // false
خط اول مقدار true بازگشت میدهد، زیرا Math.pow(2, 53) — 1 در بازه امن قرار دارد، اما خط دوم false را لاگ میکند، زیرا Math.pow(2, 53) در بازه امن قرار ندارد.
متد ()Number.parseFloat
متد parseFloat یک رشته را که به آرگومان ارسالشده تبدیل میکند و عددی را که از رشته تحلیل شده است به صورت یک عدد اعشاری بازگشت میدهد. اگر متد نتواند عدد را تحلیل کند، مقدار NaN بازگشت خواهد یافت. برای نمونه در کد زیر:
1console.log(Number.parseFloat('123.45'));
2console.log(Number.parseFloat('123'));
3console.log(Number.parseFloat('abc'));
در خط نخست مقدار 123.45 به دست میآید، خط دوم نیز مقدار 123 به دست میدهد، اما خط سوم خروجی NaN خواهد داشت.
متد ()Number.parseInt
متد parseInt یک رشته را که به آرگومان ارسالشده تبدیل میکند و عددی که از رشته تحلیل شده را به صورت یک عدد کامل بازگشت میدهد. کاراکتر نخست رشته نمیتواند تحلیل شود و radix کمتر از 11 است و از این رو NaN بازگشت مییابد. برای نمونه اگر کد زیر را بنویسیم:
1console.log(Number.parseFloat('123.45'));
2console.log(Number.parseFloat('123'));
3console.log(Number.parseFloat('abc'));
خط اول و دوم مقدار 123 بازگشت میدهند و خط سوم مقدار NaN بازگشت میدهد. همچنین radix به عنوان آرگومان دوم ارسال میشود که مبنای سیستم عددی ریاضیاتی است. اگر رشته با 0x آغاز شود در این صورت radix 16 خواهد بود. اگر رشته با هر چیز دیگری آغاز شود، radix برابر با 10 خواهد بود.
برای تبدیل یک رشته هگزادسیمال به عدد میتوانیم کدی مانند زیر بنویسیم:
1console.log(Number.parseInt('0x1'));
زمانی که خط فوق اجرا شود، مقدار 1 به دست میآید. برای تبدیل رشته باینری به عدد دهدهی، میتوانیم چیزی مانند زیر بنویسیم:
1console.log(Number.parseInt('0111', 2));
خط فوق مقدار 7 را لاگ میکند که معادل دهدهی عدد باینری 0111 است.
متدهای وهلهای
همه وهلههای Number از Number.prototype ارثبری میکنند که شیئی را به همراه متدهای وهلهای ارائه میکند. متدهای وهلهای برای Number به صورت زیر هستند.
متد ()Number.toExponential
متد toExponential رشتهای بازگشت میدهد که بازنمایی یک عدد با نمادگذاری توانی است. این متد یک optional میگیرد که تعداد ارقام کسری که باید استفاده شود را تعیین میکند. برای نمونه میتوانیم کدی به صورت زیر بنویسیم:
1(123).toExponential(1);
نتیجه اجرای کد فوق به صورت 1.2e+2 است.
متد ()Number.toFixed
متد toFixed رشتهای بازگشت میدهد که عددی را با نمادگذاری اعشاری نمایش میدهد. این متد یک optional میگیرد که تعداد ارقام کسری است که باید پس از نقطه اعشار نمایش یابد. برای نمونه کدی به صورت زیر مینویسیم:
1console.log((123).toFixed(1));
و خروجی 123.0 به دست میآید.
متد ()Number.toLocaleString
این متد عددی را با بازنمایی حساس به زبان از عدد بازگشت میدهد. این متد اقدام به باطل کردن متد ()Object.prototype.toLocaleString میکند. آرگومان نخست به صورت locale است که یک رشته locale یا آرایهای از رشتههای locale میگیرد. این آرگومان اختیاری است و یک تگ زبانی BCP 47 با کلید اکستنشن یونیکد اختیاری nu برای تعیین سیستم عددی برای قالببندی عدد میگیرد. مقادیر ممکن برای nu شامل موارد زیر هستند:
- "arab"
- "arabext"
- "bali"
- "beng"
- "deva"
- "fullwide"
- "gujr"
- "guru"
- "hanidec"
- "khmr"
- "knda"
- "laoo"
- "latn"
- "limb"
- "mlym"
- "mong"
- "mymr"
- "orya"
- "tamldec"
- "telu"
- "thai"
- "tibt"
وهلهای از شیء که از سوی سازنده ایجاد شده است متد format دارد که رشتهای با عدد قالببندی شده بازگشت میدهد.
آرگومان دوم شیئی با چند مشخصه به صورت زیر بازگشت میدهد:
- localeMatcher
- style
- unitDisplay
- currency
- useGrouping
- minimumIntegerDigits
- minimumFractionDigits
- maximumFractionDigits
- minimumSignificantDigits
- maximumSignificantDigit
گزینه localeMatcher الگوریتم تطبیق locale را برای استفاده تعیین میکند. مقادیر ممکن شامل lookup و best fit هستند. الگوریتم lookup به دنبال locale میگردد تا این که آن موردی را که با مجموعه کاراکتر رشتههای مورد مقایسه تطبیق پیدا میکند بیابد. الگوریتم best fit آن locale را مییابد که دست کم وجود دارد، اما احتمالاً مناسبتر از الگوریتم lookup است.
استایل
گزینه style، استایل قالببندی مورد استفاده را تعیین میکند. مقادیر ممکن برای گزینه style شامل decimal ،currency ،percent و unit هستند. Decimal گزینه پیشفرض است و برای قالببندی ساده اعداد استفاده میشود، currency برای قالببندی پول استفاده میشود، percent برای قالببندی درصد استفاده دارد و unit نیز برای قالببندی unit مورد بهرهبرداری قرار میگیرد.
مقادیر ممکن برای مشخصه currency شامل کدهای پولی ISO 4217 مانند USD برای دلار ایالات متحده و EUR برای یورو هستند. هیچ مقدار پیشفرضی وجود ندارد. اگر مشخصه style روی currency تنظیم شده باشد، در این صورت مشخصه currency باید ارائه شده باشد. مشخصه currencyDisplay چگونگی بومیسازی نمادهای پولی و مقدار پیشفرض را تعیین میکند، code برای افزودن کد پولی ISO استفاده میشود، name برای نام پولی بومیسازی شده مانند dollar مورد استفاده قرار میگیرد. گزینه useGrouping برای تعیین جداکننده گروهبندی در اعداد استفاده میشود و مقدار آن بولی است.
minimumIntegerDigits ،minimumFractionDigits و maximumFractionDigits یک گروه از گزینهها در نظر گرفته میشوند. minimumIntegerDigits کمترین تعداد ارقام صحیح مورد استفاده را تعیین میکند که از 1 تا 21 هستند و مقدار پیشفرض آن نیز 1 است. minimumFractionDigits کمترین تعداد ارقام کسری مورد استفاده است که از 0 تا 29 است. مقدار پیشفرض برای اعداد ساده و قالببندی درصدی برابر با 0 است. مقدار پیشفرض برای قالببندی پولی به وسیله لیست کد پولی ISO 4217 تعیین میشود و در صورتی که تعیین نشده باشد برابر با 2 خواهد بود. maximumFractionDigits بیشینه تعداد ارقام کسری مورد استفاده است و عددی بین 0 تا 20 است. مقدار پیشفرض برای اعداد ساده بیشینه بین minimumFractionDigits و 3 است. مقدار پیشفرض برای قالببندی پولی برابر با بیشینه اعداد minimumFractionDigits و تعداد ارقام unit کسری ارائه شده از سوی لیست کد ISO 4217 یا در صورت عدم ارائه مقداری از سوی این لیست برابر با 2 است. مقدار پیشفرض برای قالببندی درصدی بیشینه بین minimumFractionDigits و 0 است.
minimumSignificantDigits و maximumSignificantDigits نیز یک گروه از گزینهها در نظر گرفته میشوند. اگر دست کم یک گروه تعریف شده باشد، گروه نخست نادیده گرفته میشود. minimumSignificantDigits کمینه تعداد ارقام معنیدار مورد استفاده است. مقادیر ممکن در بازه بین 1 تا 21 قرار دارند که مقدار پیشفرض 1 است. maximumSignificantDigits بیشینه تعداد ارقام معنیدار مورد استفاده است و مقادیر ممکن در بازهای بین 1 تا 21 قرار دارد و مقدار پیشفرض برابر با 21 است.
برای نمونه میتوانیم از این متد در مثالهای زیر استفاده کنیم:
1const number = 123.45;
2console.log(number.toLocaleString('fr', {
3 style: 'currency',
4 currency: 'EUR'
5}));
6console.log(number.toLocaleString('zh-Hant-CN-u-nu-hanidec', {
7 style: 'currency',
8 currency: 'JPY'
9}))
10console.log(number.toLocaleString('en-IN', {
11 maximumSignificantDigits: 3
12}));
گزاره نخست console.log عبارت 123,45 €، گزاره دوم مقدار ¥一二三 و گزینه سوم مقدار 123 را لاگ میکند.
متد ()Number.toPrecision
متد toPrecision رشتهای بازگشت میدهد که عددی را برحسب دقت ارائه شده با نمادگذاری اعشاری یا نمایی نمایش میدهد این متد آرگومانی میگیرد که اختیاری است و اجازه تعیین مبنا بین 1 و 100 را میدهد. اگر این آرگومان ذکر نشده باشد، همه رقمهای پس از نقطه اعشار بازگشت خواهند یافت. برای نمونه میتوانیم از آن به صورت زیر استفاده کنیم:
1const numObj = 5.12345;
2console.log(numObj.toPrecision());
3console.log(numObj.toPrecision(100));
4console.log(numObj.toPrecision(5));
5console.log(numObj.toPrecision(2));
6console.log(numObj.toPrecision(1));
نتیجه اجرای هر خط از کد فوق به صورت زیر است:
5.12345 5.123450000000000059685589803848415613174438476562500000000000000000000000000000000000000000000000000 5.1235 5.1 5
متد ()Number.toString
متد toStringmethod رشتهای بازگشت میدهد که شیء ذکرشده در radix تعیینشده یا مبنای عدد را بازگشت میدهد. این متد، متد ()Object.prototype.toString را باطل میکند. radix یک آرگومان اختیاری است که اجازه تعیین مبنایی بین 2 و 36 را میدهد. مقدار پیشفرض radix برابر با 10 است. این عدد منفی نمادی است که دارد. اگر این یک عدد کامل نباشد، نماد نقطه برای جداسازیم ارقام اعشاری استفاده میشود. برای نمونه میتوانیم کد زیر را بنویسیم:
1const count = 10;
2
3console.log(count.toString()); // '10'
4console.log((15).toString()); // '15'
5console.log((15.2).toString()); // '15.2'
این کد برای اعداد غیر دهدهی نیز کار میکند. برای نمونه میتوانیم کدی به صورت زیر بنویسیم:
1con.soe.log((-0b0111).toString(10)); // '-7'
این متد برای تبدیل اعداد با مبناهای مختلف به همدیگر کارآمد است.
متد ()Number.valueOf
متد valueOf مقدار ابتدایی شیء ذکرشده را بازگشت میدهد. این متد اقدام به باطل کردن متد ()Object.prototype.valueOf میکند. برای نمونه اگر شیء Number را داشته باشیم که با عملگر new سازماندهی یافته است. میتوانیم کد زیر را بنویسیم:
1const numObj = new Number('10');
2const numPrim = numObj.valueOf();
3console.log(numPrim);
4console.log(typeof numPrim);
زمانی که کد فوق اجرا شود، نتیجه زیر لاگ میشود:
10 Number
تبدیل اشیای دیگر به اعداد
با استفاده از تابع Number میتوان اشیای Date و null را به اعداد تبدیل کرد.
برای نمونه برای اشیای Date میتوانیم کد زیر را بنویسیم:
1const d = new Date(2019, 0, 1, 0, 0, 0);
2console.log(Number(d));
به این ترتیب مقدار 1546329600000 به دست میآید که timestamp یونیکس برای تاریخ 1 ژانویه 2019 است. شیء null به 0 تبدیل خواهد شد، از این رو اگر بنویسیم:
1console.log(Number(null));
نتیجه 0 به دست میآید.
سخن پایانی
شیء جاوا اسکریپت Number یک شیء پوششی است که به ما امکان کار با اعداد را میدهد و ثابتها و متدهای مختلفی در اختیارمان قرار میدهد. یک عدد مقدماتی میتواند با استفاده از تابع ()Number ایجاد شود. این متد متدهای استاتیک و وهلهای مفید زیادی برای بررسی اعداد و تبدیل بین رشتهها و اعداد و معکوس ارائه میکند. متد toString نیز برای تبدیل اعداد در مبناهای مختلف بسیار کارآمد است.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای JavaScript (جاوااسکریپت)
- مجموعه آموزشهای برنامهنویسی
- آموزش JavaScript ES6 (جاوا اسکریپت)
- جاوا اسکریپت و توسعه وب — راهنمای استفاده از مدل شیء سند (DOM)
- جاوا اسکریپت چیست؟ — به زبان ساده
==
این آموزش محشر بود چقدر لذت بردم
مرسی واقعا