تخطَّ إلى المحتوى

الأرقام والتواريخ في JavaScript: Math و Date

الدرس 20 من 28 · JavaScript

لعبة تحتاج رقماً عشوائياً، ومتجر يقرّب السعر إلى خانتين، وتطبيق يعرض «باقٍ 3 أيام على العرض». كل هذا يحتاج أداتين مدمجتين في JavaScript: الكائن Math للعمليات الرياضية، والكائن Date للتواريخ والأوقات. في هذا الدرس ستتعلم أهم ما فيهما.

Math كائن جاهز فيه دوال وثوابت رياضية. لا تنشئه، بل تستخدمه مباشرة:

console.log(Math.round(4.5));
console.log(Math.round(4.4));
console.log(Math.floor(4.9));
console.log(Math.ceil(4.1));
console.log(Math.trunc(-4.9));
الناتج
5
4
4
5
-4
الدالة ماذا تفعل مثال
Math.round تقرّب إلى أقرب عدد صحيح 4.5 تصبح 5
Math.floor تقرّب للأسفل دائماً 4.9 تصبح 4
Math.ceil تقرّب للأعلى دائماً 4.1 تصبح 5
Math.trunc تحذف الكسر فقط -4.9 تصبح -4

تخيّل floor مثل أرضية الغرفة و ceil مثل سقفها: الأولى تنزل بك إلى أقرب عدد صحيح تحتك، والثانية ترفعك إلى أقرب عدد صحيح فوقك.

متى تحتاج ceil؟ عندك 23 منتجاً وتعرض 10 في الصفحة. عدد الصفحات هو Math.ceil(23 / 10) أي 3، لأن المنتجات الثلاثة الباقية تحتاج صفحة.

console.log(Math.max(3, 9, 5));
console.log(Math.min(3, 9, 5));
console.log(Math.abs(-7));
console.log(Math.pow(2, 10));
console.log(Math.sqrt(81));
console.log(Math.PI);
الناتج
9
3
7
1024
9
3.141592653589793
  • max و min: الأكبر والأصغر. ولمصفوفة استخدم النشر: Math.max(...numbers).
  • abs: القيمة المطلقة، أي الرقم بلا إشارة.
  • pow(2, 10): الأس، ويمكن كتابته أيضاً 2 ** 10.
  • sqrt: الجذر التربيعي.

Math.random() تُرجع رقماً عشوائياً من 0 إلى أقل من 1، مثل 0.4173. وحدها قليلة الفائدة، لكن بمعادلة صغيرة تحصل على عدد صحيح في أي مدى:

function randomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
const dice = randomInt(1, 6);
console.log(dice >= 1 && dice <= 6);
الناتج
true

كيف تعمل المعادلة لرمي نرد من 1 إلى 6؟

  1. Math.random() تعطي رقماً من 0 إلى 0.999.
  2. نضربه في 6 فيصبح من 0 إلى 5.999.
  3. Math.floor تحذف الكسر فيصبح من 0 إلى 5.
  4. نضيف 1 فيصبح من 1 إلى 6.

واختيار عنصر عشوائي من مصفوفة تطبيق مباشر لنفس الفكرة:

const quotes = ["ابدأ الآن", "استمر", "لا تتوقف"];
const pick = quotes[Math.floor(Math.random() * quotes.length)];
console.log(quotes.includes(pick));
الناتج
true
const price = 1234.5678;
console.log(price.toFixed(2));
console.log(typeof price.toFixed(2));
console.log(Number(price.toFixed(1)) + 1);
console.log((1250000).toLocaleString("en-US"));
الناتج
1234.57
string
1235.6
1,250,000
  • toFixed(2): تقرّب إلى خانتين عشريتين. انتبه: النتيجة نص، فإذا أردت الحساب بها حوّلها بـ Number.
  • toLocaleString: تضيف فواصل الآلاف بحسب اللغة التي تحددها.

وهناك مفاجأة مشهورة في الكسور العشرية:

console.log(0.1 + 0.2);
console.log((0.1 + 0.2).toFixed(2));
الناتج
0.30000000000000004
0.30

هذا ليس خطأ في JavaScript وحدها، بل طريقة تخزين الكسور في كل الكمبيوترات تقريباً. الحل عند العرض هو toFixed. وفي الحسابات المالية الدقيقة يُحسب بالقروش كأعداد صحيحة، ثم يُقسم على 100 عند العرض.

const meeting = new Date(2026, 10, 11, 14, 30);
console.log(meeting.getFullYear());
console.log(meeting.getMonth());
console.log(meeting.getDate());
console.log(meeting.getDay());
console.log(meeting.getHours(), meeting.getMinutes());
الناتج
2026
10
11
3
14 30
  • new Date() بدون معاملات تعطي اللحظة الحالية.
  • new Date(سنة, شهر, يوم, ساعة, دقيقة) تنشئ تاريخاً محدداً.
الدالة تُرجع
getFullYear() السنة
getMonth() الشهر من 0 إلى 11
getDate() يوم الشهر من 1 إلى 31
getDay() يوم الأسبوع: 0 للأحد إلى 6 للسبت
getHours() و getMinutes() الساعة والدقيقة

لاحظ الفرق: getDate يوم الشهر، و getDay يوم الأسبوع. والرقم 3 في الناتج يعني الأربعاء.

داخلياً يخزن Date رقماً واحداً: عدد الملّي ثوانٍ منذ بداية عام 1970. لذلك يمكن طرح تاريخين مباشرة:

const start = new Date(2026, 10, 11);
const end = new Date(2026, 11, 25);
const diffMs = end - start;
const days = Math.round(diffMs / (1000 * 60 * 60 * 24));
console.log(days);
الناتج
44

الطرح يعطي الفرق بالملّي ثانية. نقسمه على عدد الملّي ثوانٍ في اليوم: 1000 في الثانية، ضرب 60 ثانية، ضرب 60 دقيقة، ضرب 24 ساعة.

ولإضافة أيام إلى تاريخ، عدّل يوم الشهر، و Date يتولى الانتقال إلى الشهر التالي:

const delivery = new Date(2026, 10, 28);
delivery.setDate(delivery.getDate() + 5);
console.log(delivery.getMonth() + 1, delivery.getDate());
الناتج
12 3

28 نوفمبر مع 5 أيام يساوي 3 ديسمبر، وحُسبت تلقائياً.

const day = new Date(2026, 10, 11);
console.log(day.toLocaleDateString("en-GB"));
console.log(day.toISOString().slice(0, 10).length);
الناتج
11/11/2026
10

toLocaleDateString تنسق التاريخ بحسب اللغة. جرّب "ar-EG" في المتصفح لترى التاريخ بالأرقام والأسماء العربية. أما toISOString فتعطي الصيغة القياسية التي تُرسل إلى الخوادم وتُحفظ في قواعد البيانات، وأولها بالشكل 2026-11-11.

جرّب بنفسكJavaScript
أو اضغط Ctrl + Enter

الناتج

اضغط «شغّل» عدة مرات وراقب تغيّر النردين. ثم عدّل الكود ليحسب الأيام الباقية على عيد ميلادك.

  • نسيان أن الشهور تبدأ من صفر: new Date(2026, 12, 1) ليست ديسمبر، بل يناير 2027.
  • الحساب بناتج toFixed مباشرة: النتيجة نص، فتحصل على دمج نصوص بدل الجمع. حوّلها بـ Number.
  • استخدام Math.round لرقم عشوائي في مدى: يجعل الطرفين أقل حظاً من الوسط. استخدم Math.floor مع المعادلة.

سؤال

ما ناتج Math.floor(7.9)؟

سؤال

أي شهر يمثله new Date(2026, 0, 15)؟

  • Math.round و floor و ceil و trunc للتقريب، ولكل واحدة اتجاهها.
  • رقم عشوائي صحيح في مدى: Math.floor(Math.random() * (max - min + 1)) + min.
  • toFixed تقرّب للعرض وتُرجع نصاً، و toLocaleString تضيف فواصل الآلاف.
  • new Date() للحظة الحالية، والشهور تبدأ من صفر.
  • طرح تاريخين يعطي الفرق بالملّي ثانية، ومنه تحسب الأيام.