الأرقام والتواريخ في JavaScript: Math و Date
لعبة تحتاج رقماً عشوائياً، ومتجر يقرّب السعر إلى خانتين، وتطبيق يعرض «باقٍ 3 أيام على العرض». كل هذا يحتاج أداتين مدمجتين في JavaScript: الكائن Math للعمليات الرياضية، والكائن Date للتواريخ والأوقات. في هذا الدرس ستتعلم أهم ما فيهما.
التقريب بدوال Math
Section titled “التقريب بدوال Math”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));5445-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، لأن المنتجات الثلاثة الباقية تحتاج صفحة.
دوال أخرى مفيدة
Section titled “دوال أخرى مفيدة”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);937102493.141592653589793maxوmin: الأكبر والأصغر. ولمصفوفة استخدم النشر:Math.max(...numbers).abs: القيمة المطلقة، أي الرقم بلا إشارة.pow(2, 10): الأس، ويمكن كتابته أيضاً2 ** 10.sqrt: الجذر التربيعي.
الأرقام العشوائية
Section titled “الأرقام العشوائية”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؟
Math.random()تعطي رقماً من 0 إلى 0.999.- نضربه في 6 فيصبح من 0 إلى 5.999.
Math.floorتحذف الكسر فيصبح من 0 إلى 5.- نضيف 1 فيصبح من 1 إلى 6.
واختيار عنصر عشوائي من مصفوفة تطبيق مباشر لنفس الفكرة:
const quotes = ["ابدأ الآن", "استمر", "لا تتوقف"];const pick = quotes[Math.floor(Math.random() * quotes.length)];console.log(quotes.includes(pick));trueتنسيق الأرقام
Section titled “تنسيق الأرقام”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.57string1235.61,250,000toFixed(2): تقرّب إلى خانتين عشريتين. انتبه: النتيجة نص، فإذا أردت الحساب بها حوّلها بـNumber.toLocaleString: تضيف فواصل الآلاف بحسب اللغة التي تحددها.
وهناك مفاجأة مشهورة في الكسور العشرية:
console.log(0.1 + 0.2);console.log((0.1 + 0.2).toFixed(2));0.300000000000000040.30هذا ليس خطأ في JavaScript وحدها، بل طريقة تخزين الكسور في كل الكمبيوترات تقريباً. الحل عند العرض هو toFixed. وفي الحسابات المالية الدقيقة يُحسب بالقروش كأعداد صحيحة، ثم يُقسم على 100 عند العرض.
إنشاء التواريخ: Date
Section titled “إنشاء التواريخ: Date”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());20261011314 30new Date()بدون معاملات تعطي اللحظة الحالية.new Date(سنة, شهر, يوم, ساعة, دقيقة)تنشئ تاريخاً محدداً.
| الدالة | تُرجع |
|---|---|
getFullYear() |
السنة |
getMonth() |
الشهر من 0 إلى 11 |
getDate() |
يوم الشهر من 1 إلى 31 |
getDay() |
يوم الأسبوع: 0 للأحد إلى 6 للسبت |
getHours() و getMinutes() |
الساعة والدقيقة |
لاحظ الفرق: getDate يوم الشهر، و getDay يوم الأسبوع. والرقم 3 في الناتج يعني الأربعاء.
الفرق بين تاريخين
Section titled “الفرق بين تاريخين”داخلياً يخزن 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 328 نوفمبر مع 5 أيام يساوي 3 ديسمبر، وحُسبت تلقائياً.
عرض التاريخ للمستخدم
Section titled “عرض التاريخ للمستخدم”const day = new Date(2026, 10, 11);console.log(day.toLocaleDateString("en-GB"));console.log(day.toISOString().slice(0, 10).length);11/11/202610toLocaleDateString تنسق التاريخ بحسب اللغة. جرّب "ar-EG" في المتصفح لترى التاريخ بالأرقام والأسماء العربية. أما toISOString فتعطي الصيغة القياسية التي تُرسل إلى الخوادم وتُحفظ في قواعد البيانات، وأولها بالشكل 2026-11-11.
جرّب بنفسك
Section titled “جرّب بنفسك”الناتج
اضغط «شغّل» عدة مرات وراقب تغيّر النردين. ثم عدّل الكود ليحسب الأيام الباقية على عيد ميلادك.
أخطاء شائعة
Section titled “أخطاء شائعة”- نسيان أن الشهور تبدأ من صفر:
new Date(2026, 12, 1)ليست ديسمبر، بل يناير 2027. - الحساب بناتج toFixed مباشرة: النتيجة نص، فتحصل على دمج نصوص بدل الجمع. حوّلها بـ
Number. - استخدام Math.round لرقم عشوائي في مدى: يجعل الطرفين أقل حظاً من الوسط. استخدم
Math.floorمع المعادلة.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما ناتج Math.floor(7.9)؟
Math.floor تقرّب للأسفل دائماً، فتحذف الكسر مهما كان كبيراً.
سؤال
أي شهر يمثله new Date(2026, 0, 15)؟
الشهور في Date تبدأ من صفر، فالرقم 0 هو يناير والرقم 11 هو ديسمبر.
الخلاصة
Section titled “الخلاصة”Math.roundوfloorوceilوtruncللتقريب، ولكل واحدة اتجاهها.- رقم عشوائي صحيح في مدى:
Math.floor(Math.random() * (max - min + 1)) + min. toFixedتقرّب للعرض وتُرجع نصاً، وtoLocaleStringتضيف فواصل الآلاف.new Date()للحظة الحالية، والشهور تبدأ من صفر.- طرح تاريخين يعطي الفرق بالملّي ثانية، ومنه تحسب الأيام.