شیء Math در جاوااسکریپت، کمربند ابزار بیصدای این زبان است. شما هرگز آن را نمونهسازی نمیکنید. هرگز آن را وارد (import) نمیکنید. این شیء صرفاً در هر محیط اجرا وجود دارد و آماده است تا همه چیز را مدیریت کند؛ از گرد کردن یک مقدار پیکسل گرفته تا تولید یک عدد تصادفی برای تاس. از آنجایی که Math یک شیء استاتیک است، هر متد و ویژگی مستقیماً از فضای نام (namespace) آن فراخوانی میشود. شما مینویسید Math.PI و نه new Math().PI. این انتخاب طراحی باعث ساده ماندن امور میشود، اما به این معناست که این شیء دارای چند نکته حساس است که بهتر است قبل از تکیه بر آن در منطق برنامههای عملیاتی (production)، آنها را درک کنید.
یک شیء استاتیک بدون سازنده (Constructor)
بیشتر اشیاء داخلی جاوااسکریپت از شما میخواهند که یک نمونه بسازید. شما new Date() یا new Array() را فراخوانی میکنید. اما Math این کار را نمیپذیرد. این شیء به عنوان یک فضای نام از توابع و ثوابت مرتبط طراحی شده است که روی نوع داده اولیه Number عمل میکنند. اگر Math.sqrt(16) را فراخوانی کنید، عدد ۴ را دریافت میکنید. اگر سعی کنید از کلمه کلیدی new استفاده کنید، موتور جاوااسکریپت خطای TypeError میدهد. این الگو باعث میشود حافظه تمیز بماند و نشاندهنده این است که Math کاملاً تابعی (functional) است. ورودی میگیرد، خروجی میدهد و هیچچیز را تغییر نمیدهد (mutate نمیکند).
یک محدودیت سختگیرانه وجود دارد که باید به خاطر بسپارید: Math با اعداد استاندارد IEEE 754 کار میکند. این شیء با BigInt سازگار نیست. اگر یک BigInt را به Math.round() یا Math.abs() پاس دهید، با خطای TypeError مواجه خواهید شد. اگر برنامه شما با اعداد صحیح ۶۴ بیتی یا بزرگتر سروکار دارد، باید آنها را به نوع داده کوچکتر تبدیل کنید یا محاسبات را با استفاده از عملگرهای بومی BigInt انجام دهید.
ثوابتی که واقعاً از آنها استفاده میکنید
شیء Math چندین ثابت عددی را ارائه میدهد که شما را از کدنویسی مستقیم اعداد جادویی (magic numbers) بینیاز میکند.
Math.PIهمان عدد آشنای ۳.۱۴۱۵۹... است که برای هر چیزی که با دایره، مثلثات یا تبدیل درجه به رادیان در ارتباط است، ضروری است.Math.Eعدد اویلر است که تقریباً برابر با ۲.۷۱۸ میباشد. این عدد در منحنیهای رشد نمایی، محاسبات سود مرکب و مقیاسهای لگاریتمی ظاهر میشود.Math.SQRT2جذر عدد دو است که تقریباً برابر با ۱.۴۱۴ میباشد. زمانی که به قطر یک مربع نیاز دارید یا میخواهید بردارها را در هندسه ساده نرمالسازی کنید، این ثابت بسیار کاربردی است.Math.LN2لگاریتم طبیعی عدد ۲ است که تقریباً برابر با ۰.۶۹۳ میباشد. شما این را در الگوریتمهایی که با درختهای باینری، آنتروپی اطلاعات یا تحلیل پیچیدگی زمانی (با محاسبات لگاریتم مبنای ۲) سروکار دارند، خواهید دید.
این مقادیر همگی از نوع ممیز شناور با دقت مضاعف (double-precision floats) هستند. از آنجایی که اینها ویژگی (property) هستند و نه متد، بدون پرانتز به آنها دسترسی پیدا میکنید.
گرد کردن، علامتها و قدر مطلق
رایجترین وظایف Math شامل اصلاح و مرتبسازی یک عدد است. جاوااسکریپت چهار روش گرد کردن به شما ارائه میدهد که رفتار آنها یکسان نیست، بهویژه زمانی که از اعداد مثبت خارج میشوید.
Math.abs(x) قدر مطلق (بزرگی) یک عدد را برمیگرداند. اگر ۴۲- را به آن بدهید، ۴۲ را دریافت میکنید. این متد زمانی مفید است که به جای جهت، به فاصله اهمیت میدهید. مثلاً هنگام مقایسه برچسبهای زمانی (timestamps)، محاسبه تغییرات جابهجایی (drag deltas) در رابط کاربری، یا بررسی اینکه آیا یک حدس در محدوده خطا قرار دارد یا خیر.
Math.round(x) همان گردکننده معمولی است. این متد نزدیکترین عدد صحیح را انتخاب میکند و در صورت قرار گرفتن روی نیم (مثلاً .۵)، آن را به سمت عدد صحیح مثبت بعدی گرد میکند. بنابراین ۴.۴ به ۴ و ۴.۵ به ۵ تبدیل میشود.
Math.ceil(x) همیشه به سمت بالا به سمت عدد صحیح بعدی گرد میکند. ۴.۱ به ۵ و ۴.۹- به ۴- تبدیل میشود. مورد آخر معمولاً کاربران را غافلگیر میکند؛ زیرا ۴- روی خط اعداد بزرگتر از ۴.۹- است، بنابراین ceil برای اعداد منفی به سمت صفر حرکت میکند.
Math.floor(x) دقیقاً برعکس است. این متد همیشه به سمت پایین گرد میکند. ۴.۹ به ۴ و ۴.۱- به ۵- تبدیل میشود. اگر در حال صفحهبندی (pagination) نتایج جستجو یا تخصیص بلوکهای حافظه با اندازه ثابت هستید، معمولاً floor همان چیزی است که نیاز دارید.
Math.trunc(x) بخش اعشاری را کاملاً حذف میکند و فقط بخش صحیح را باقی میگذارد. در واقع، این متد بدون توجه به علامت، به سمت صفر حرکت میکند. ۴.۹ به ۴ و ۴.۹- به ۴- تبدیل میشود. اگر در حال انتقال منطق برنامهای از زبانهایی هستید که اعداد ممیز شناور را با حذف بخش اعشاری به عدد صحیح تبدیل میکنند (cast)، این متد بهترین دوست شماست.
در نهایت، Math.sign(x) به شما میگوید که یک مقدار در کدام سمت صفر قرار دارد. این متد برای اعداد مثبت ۱، برای اعداد منفی ۱-، برای صفر مثبت ۰، برای صفر منفی ۰- و برای هر چیزی که عدد نباشد NaN را برمیگرداند. این یک روش مختصر برای شرطیسازی بر اساس جهت، بدون نوشتن زنجیرهای از if-else است.
تولید اعداد تصادفی
Math.random() یک عدد ممیز شناور شبهتصادفی از ۰ (شامل خود صفر) تا ۱ (بدون خود یک) تولید میکند. این متد از نظر رمزنگاری امن نیست، بنابراین از آن برای تولید رمز عبور، ساخت توکن یا هر چیزی که با پول واقعی در ارتباط است، استفاده نکنید.
