يُعد كائن Math في JavaScript بمثابة حزام الأدوات الهادئ للغة. أنت لا تقوم بإنشاء مثيل (instantiate) منه أبداً، ولا تقوم باستيراده (import) أبداً. إنه موجود ببساطة في كل بيئة تشغيل (runtime)، جاهزاً للتعامل مع كل شيء، بدءاً من تقريب قيمة بكسل وصولاً إلى توليد رمية نرد عشوائية. ولأن Math هو كائن ثابت (static object)، فإن كل طريقة (method) وخاصية (property) تتبع مباشرة لمساحة الأسماء (namespace). أنت تكتب Math.PI وليس new Math().PI. هذا الخيار في التصميم يحافظ على بساطة الأمور، ولكنه يعني أيضاً أن الكائن يحمل بعض الجوانب الحادة التي تستحق الفهم قبل أن تعتمد عليه في منطق الإنتاج (production logic).

كائن ثابت بدون مُنشئ (Constructor)

معظم كائنات JavaScript المدمجة تطلب منك إنشاء مثيل منها؛ حيث تستدعي new Date() أو new Array(). أما Math فيرفض ذلك. لقد صُمم ليكون مساحة أسماء (namespace) من الدوال والثوابت المرتبطة التي تعمل على النوع البدائي Number. استدعِ Math.sqrt(16) وستحصل على 4. حاول استخدام الكلمة المفتاحية new وسيقوم المحرك بإلقاء خطأ من نوع TypeError. هذا النمط يحافظ على نظافة الذاكرة ويشير إلى أن Math هو كائن وظيفي (purely functional) بحت؛ فهو يأخذ مدخلات، ويعيد مخرجات، ولا يغير (mutates) أي شيء.

هناك قيد صارم واحد يجب تذكره: يعمل Math مع أرقام IEEE 754 القياسية، ولا يعمل مع BigInt. إذا مررت BigInt إلى Math.round() أو Math.abs() فستحصل على TypeError. إذا كان تطبيقك يتعامل مع أعداد صحيحة بـ 64 بت أو أكبر، فستحتاج إلى التحويل إلى نوع أصغر أو التعامل مع العمليات الحسابية باستخدام معاملات BigInt الأصلية بدلاً من ذلك.

الثوابت التي تستخدمها بالفعل

يكشف كائن Math عن عدة ثوابت عددية تغنيك عن كتابة الأرقام السحرية (magic numbers) يدوياً.

  • Math.PI هو الرقم المألوف 3.14159...، وهو أساسي لأي شيء يتضمن الدوائر، أو حساب المثلثات، أو تحويل الدرجات إلى راديان.
  • Math.E هو عدد أويلر، ويساوي تقريباً 2.718. يظهر في منحنيات النمو الأسي، وحسابات الفائدة المركبة، والمقاييس اللوغاريتمية.
  • Math.SQRT2 هو الجذر التربيعي لـ 2، ويساوي حوالي 1.414. وهو مفيد عندما تحتاج إلى قطر المربع أو عندما تريد تطبيع المتجهات (normalize vectors) في الهندسة البسيطة.
  • Math.LN2 هو اللوغاريتم الطبيعي لـ 2، ويساوي تقريباً 0.693. ستجد هذا في الخوارزميات التي تتعامل مع الأشجار الثنائية (binary trees)، أو إنتروبيا المعلومات، أو تحليل التعقيد الزمني الذي يتضمن رياضيات اللوغاريتم ذو الأساس 2.

هذه القيم هي أرقام عائمة مزدوجة الدقة (double-precision floats). ولأنها خصائص وليست دوال، فإنك تصل إليها بدون أقواس.

التقريب، الإشارات، والقيم المطلقة

تتضمن مهام Math الأكثر شيوعاً تنظيف الأرقام. توفر لك JavaScript أربع طرق للتقريب، وهي لا تتصرف بشكل متطابق، خاصة بمجرد خروجك من نطاق الأرقام الموجبة.

تعيد Math.abs(x) مقدار الرقم. إذا مررت لها -42 ستحصل على 42. وهي مفيدة عندما تهتم بالمسافة بدلاً من الاتجاه؛ فكر في مقارنة الطوابع الزمنية، أو حساب فروق السحب في واجهة المستخدم، أو التحقق مما إذا كانت التخمينات تقع ضمن هامش الخطأ.

تعتبر Math.round(x) هي طريقة التقريب المدرسية التقليدية. فهي تأخذ أقرب عدد صحيح، مع تقريب الأنصاف إلى العدد الصحيح الموجب التالي. لذا، 4.4 تصبح 4، و4.5 تصبح 5.

تقوم Math.ceil(x) دائماً بالتقريب للأعلى إلى العدد الصحيح التالي. 4.1 تصبح 5، و-4.9 تصبح -4. هذه الأخيرة قد تفاجئ البعض؛ لأن -4 أكبر من -4.9 على خط الأعداد، لذا فإن التقريب للأعلى (ceiling) يتحرك باتجاه الصفر بالنسبة للأرقام السالبة.

أما Math.floor(x) فهي العكس تماماً؛ فهي تقرب دائماً للأسفل. 4.9 تصبح 4، و-4.1 تصبح -5. إذا كنت تقوم بتقسيم نتائج البحث إلى صفحات (paginating) أو تخصيص كتل ذاكرة ثابتة الحجم، فإن floor هي ما تريده عادةً.

تقوم Math.trunc(x) بحذف الجزء العشري تماماً، تاركة الجزء الصحيح فقط. في الواقع، هي تتحرك باتجاه الصفر بغض النظر عن الإشارة. 4.9 تصبح 4، و-4.9 تصبح -4. إذا كنت تنقل منطقاً برمجياً من لغات تقوم بتحويل الأرقام العائمة إلى أعداد صحيحة عن طريق البتر (truncating)، فهذه الدالة هي صديقتك.

أخيراً، تخبرك Math.sign(x) في أي جانب من الصفر تقع القيمة. فهي تعيد 1 للموجب، و-1 للسالب، و0 للصفر الموجب، و-0 للصفر السالب، وNaN لأي شيء ليس رقماً. إنها طريقة موجزة للتفرع بناءً على الاتجاه دون الحاجة لكتابة سلسلة من جمل if-else.

توليد الأرقام العشوائية

تنتج Math.random() رقماً عشرياً شبه عشوائي (pseudo-random float) من 0 (متضمن) إلى 1 (غير متضمن). وهي ليست آمنة من الناحية التشفيرية (cryptographically secure)، لذا لا تستخدمها لتوليد كلمات المرور، أو إنشاء الرموز المميزة (tokens)، أو أي شيء يتعلق بالأموال الحقيقية.