عندما نبدأ في تعلم JavaScript، قد يبدو أن التعامل مع النصوص والمتغيرات هو الجزء الأكبر من الرحلة، لكن سرعان ما نكتشف أن العمليات الحسابية هي ما يمنح البرامج معناها الحقيقي. أي برنامج يتعامل مع أرقام، أسعار، نقاط، وقت، أو نتائج يعتمد بشكل مباشر على العمليات الحسابية.
JavaScript لا تُستخدم فقط لعرض المحتوى، بل لمعالجة البيانات واتخاذ قرارات بناءً على أرقام وقيم تتغير باستمرار. من حساب مجموع منتجات في متجر إلكتروني، إلى تتبع عدد الزيارات، أو حساب نتيجة اختبار، كل هذه السيناريوهات تعتمد على عمليات حسابية بسيطة في جوهرها.
الكثير من المبتدئين يواجهون ارتباكًا عند استخدام العمليات الحسابية، خاصة عندما تختلط الأرقام مع النصوص أو عند ظهور نتائج غير متوقعة. غالبًا لا تكون المشكلة في العملية نفسها، بل في فهم كيف تتعامل JavaScript مع القيم التي نستخدمها.
في هذا المقال، سنفهم العمليات الحسابية في JavaScript خطوة خطوة، بأسلوب واضح وعملي. سنرى كيف تعمل كل عملية، ومتى نستخدمها، وكيف نتجنب الأخطاء الشائعة. الهدف ليس حفظ الرموز، بل فهم المنطق الذي يجعل JavaScript تعطي النتيجة التي نراها.
عند نهاية هذا المقال، ستكون قادرًا على استخدام العمليات الحسابية بثقة داخل متغيراتك وبرامجك، وستدرك كيف تشكّل هذه العمليات الأساس الذي يُبنى عليه المنطق البرمجي في JavaScript.
ما هي العمليات الحسابية في JavaScript؟
العمليات الحسابية في JavaScript هي الأدوات التي تسمح لنا بالتعامل مع الأرقام وتحويلها إلى نتائج مفيدة. بدل الاكتفاء بتخزين القيم داخل متغيرات، نستخدم العمليات الحسابية لمعالجة هذه القيم، حساب نتائج جديدة، وبناء منطق يعتمد على الأرقام.
في الحياة اليومية، نحن نستخدم العمليات الحسابية دون أن نشعر. نجمع الأسعار، نطرح الخصومات، نضرب الكميات، ونقسم الوقت أو المسافات. JavaScript تحاول محاكاة هذا التفكير، لكنها تفعل ذلك وفق قواعد دقيقة يجب فهمها حتى لا نفاجأ بالنتائج.
العملية الحسابية ببساطة هي إجراء يُطبق على رقمين أو أكثر لإنتاج نتيجة جديدة. هذه الأرقام قد تكون قيمًا ثابتة، أو متغيرات تتغير مع الوقت. JavaScript توفر مجموعة من العمليات الأساسية التي تُستخدم في كل البرامج تقريبًا.
ما يميز JavaScript هو أنها تسمح باستخدام العمليات الحسابية داخل تعبيرات معقدة، وليس فقط في أسطر منفصلة. يمكن جمع عدة عمليات في سطر واحد، أو استخدام نتيجة عملية داخل عملية أخرى، مما يمنح مرونة كبيرة في بناء الحسابات.
فهم العمليات الحسابية لا يعني فقط معرفة الرموز، بل فهم كيف تتفاعل مع أنواع البيانات المختلفة. الرقم ليس كالنص، واستخدام العملية نفسها مع نوعين مختلفين قد يعطي نتيجة مختلفة تمامًا.
في الفصول القادمة، سنفصل كل عملية على حدة، مع أمثلة واضحة، حتى تصبح العمليات الحسابية جزءًا طبيعيًا من تفكيرك أثناء كتابة JavaScript.

عملية الجمع (+)
عملية الجمع هي أول وأبسط عملية حسابية يتعرف عليها المبتدئ في JavaScript، لكنها في نفس الوقت من أكثر العمليات التي تسبب ارتباكًا إذا لم تُفهم جيدًا. السبب ليس في الجمع نفسه، بل في الطريقة التي تتعامل بها JavaScript مع أنواع البيانات المختلفة عند استخدام هذا الرمز.
عندما نستخدم علامة الجمع بين رقمين، تتصرف JavaScript كما نتوقع تمامًا، وتقوم بعملية حسابية عادية. الرقم الأول يُضاف إلى الرقم الثاني، والنتيجة تكون رقمًا جديدًا يمكن تخزينه أو استخدامه لاحقًا.
لكن علامة الجمع لا تُستخدم للحساب فقط، بل تُستخدم أيضًا لدمج النصوص. عندما يكون أحد القيم نصًا، تقوم JavaScript بتحويل القيمة الأخرى إلى نص، ثم تقوم بدمج القيم بدل جمعها حسابيًا. هذا السلوك هو أكثر سبب لنتائج غير متوقعة عند المبتدئين.
<!-- let a = 10; let b = 5; let result = a + b; console.log(result); -->
في هذا المثال، العملية واضحة. المتغيران يحملان أرقامًا، لذلك JavaScript تقوم بجمعهما حسابيًا وتُرجع نتيجة رقمية. هذا هو السلوك الطبيعي لعملية الجمع عند التعامل مع الأرقام فقط.
<!-- let x = "10"; let y = 5; console.log(x + y); -->
هنا يختلف الوضع تمامًا. القيمة الأولى نصية، لذلك JavaScript تعتبر العملية دمج نصوص، وليس جمعًا حسابيًا. النتيجة تكون نصًا جديدًا ناتجًا عن ربط القيمتين، وليس مجموعهما العددي.
فهم هذا الفرق مهم جدًا، لأن علامة الجمع هي الوحيدة بين العمليات الحسابية التي يمكن أن تغيّر سلوكها حسب نوع البيانات. لهذا السبب، يجب دائمًا الانتباه إلى نوع القيم عند استخدامها.
عندما تستوعب هذا السلوك، ستتجنب عددًا كبيرًا من الأخطاء الشائعة، وستبدأ في استخدام عملية الجمع بوعي وثقة داخل برامجك.

عملية الطرح (-)
عملية الطرح في JavaScript أبسط من الجمع من حيث السلوك، لأنها تُستخدم للحساب فقط ولا تدخل في دمج النصوص. عندما ترى علامة الطرح، يمكنك أن تطمئن أن JavaScript ستحاول دائمًا إجراء عملية حسابية، وليس إنشاء نص جديد.
الطرح يُستخدم لتقليل قيمة من أخرى، مثل حساب الفرق بين رقمين، خصم قيمة، أو تتبع نقصان متغير مع الوقت. هذه العملية شائعة جدًا في العدّ التنازلي، حساب الخصومات، أو تتبع الرصيد المتبقي.
على عكس الجمع، إذا حاولت استخدام الطرح مع قيمة نصية تحتوي على رقم، فإن JavaScript تحاول تحويل النص إلى رقم تلقائيًا. إذا نجحت في التحويل، تُجرى العملية الحسابية، وإذا فشلت، تكون النتيجة غير صالحة للحساب.
<!-- let total = 100; let discount = 30; let finalPrice = total - discount; console.log(finalPrice); -->
في هذا المثال، المتغيران يحملان أرقامًا، والنتيجة تكون واضحة ومتوقعة. JavaScript تطرح القيمة الثانية من الأولى وتُرجع رقمًا جديدًا يمثل النتيجة النهائية.
<!-- let a = "20"; let b = 5; console.log(a - b); -->
هنا نلاحظ سلوكًا مهمًا. رغم أن القيمة الأولى نصية، إلا أن JavaScript تحاول تحويلها إلى رقم لأنها عملية طرح. طالما أن النص يحتوي على رقم صالح، تتم العملية الحسابية بنجاح.
هذا السلوك قد يكون مفيدًا في بعض الحالات، لكنه قد يخفي أخطاء إذا لم تكن القيم واضحة. لذلك من الأفضل دائمًا التأكد من أن القيم التي تُستخدم في الطرح هي أرقام فعلية، وليس نصوصًا تعتمد على التحويل التلقائي.
فهم عملية الطرح يساعدك على بناء منطق أوضح في برامجك، ويمنحك ثقة أكبر عند التعامل مع القيم التي تتناقص أو تتغير مع الوقت.

عملية الضرب (*)
عملية الضرب في JavaScript تُستخدم عندما نحتاج إلى تكرار قيمة عددية أو حساب نتيجة تعتمد على مضاعفة رقم برقم آخر. هذه العملية واضحة في سلوكها ولا تحمل التعقيد الموجود في عملية الجمع، لأنها مخصصة للحساب فقط ولا تُستخدم مع النصوص.
الضرب شائع جدًا في السيناريوهات الواقعية، مثل حساب السعر الإجمالي بناءً على عدد الوحدات، حساب المساحات، أو مضاعفة القيم داخل الحلقات. في كل هذه الحالات، JavaScript تتعامل مع الضرب بطريقة حسابية مباشرة.
مثل عملية الطرح، إذا كانت إحدى القيم نصًا يحتوي على رقم، فإن JavaScript تحاول تحويله إلى رقم قبل تنفيذ عملية الضرب. إذا كان التحويل ممكنًا، تُنفذ العملية بنجاح، وإذا لم يكن كذلك، تكون النتيجة غير صالحة للحساب.
<!-- let price = 25; let quantity = 4; let total = price * quantity; console.log(total); -->
في هذا المثال، نستخدم متغيرين يحملان قيمًا عددية، ونحسب الناتج بضربهما. JavaScript تنفذ العملية كما نتوقع تمامًا، وتُرجع نتيجة رقمية يمكن استخدامها في أي حساب لاحق.
<!-- let x = "6"; let y = 3; console.log(x * y); -->
هنا نلاحظ أن JavaScript تقوم بتحويل النص إلى رقم تلقائيًا، ثم تُجري عملية الضرب. طالما أن النص يحتوي على قيمة رقمية صالحة، فإن العملية تنجح دون مشاكل.
رغم أن هذا السلوك قد يبدو مريحًا، إلا أن الاعتماد عليه بشكل دائم ليس فكرة جيدة. الأفضل دائمًا أن تكون القيم التي تضربها أرقامًا واضحة، حتى يكون سلوك الكود متوقعًا وسهل الفهم.
عملية الضرب تُعد من العمليات الأساسية التي ستستخدمها كثيرًا، سواء في الحسابات البسيطة أو في بناء منطق أكثر تعقيدًا. فهمها بشكل جيد يجعل التعامل مع الأرقام في JavaScript أكثر سلاسة وثقة.

عملية القسمة (/)
عملية القسمة في JavaScript تُستخدم عندما نريد توزيع قيمة على أخرى، أو حساب ناتج تقسيم رقم على رقم آخر. هذه العملية شائعة جدًا في حساب المتوسطات، تقسيم الكميات، أو تحويل القيم من شكل إلى آخر. JavaScript تتعامل مع القسمة بطريقة حسابية مباشرة، دون سلوكيات مزدوجة مثل الجمع.
من الأمور المهمة التي يجب معرفتها أن نتيجة القسمة في JavaScript قد تكون عددًا عشريًا. اللغة لا تقوم بتقريب النتيجة تلقائيًا، بل تُرجع الناتج كما هو. هذا السلوك مفيد في كثير من الحالات، لكنه قد يحتاج إلى معالجة إضافية إذا كنت تريد نتيجة صحيحة فقط.
مثل الطرح والضرب، إذا كانت إحدى القيم نصًا يحتوي على رقم، فإن JavaScript تحاول تحويله إلى رقم قبل تنفيذ القسمة. طالما أن التحويل ممكن، تتم العملية بنجاح.
<!-- let total = 100; let people = 4; let share = total / people; console.log(share); -->
في هذا المثال، يتم تقسيم قيمة على عدد الأشخاص، وتكون النتيجة واضحة ومنطقية. JavaScript تُرجع رقمًا يمكن استخدامه مباشرة في حسابات أخرى.
حالة خاصة يجب الانتباه لها هي القسمة على صفر. في الرياضيات التقليدية هذا غير ممكن، لكن JavaScript لا توقف التنفيذ، بل تُرجع قيمة خاصة تعبّر عن نتيجة غير محدودة. هذا السلوك قد يمر دون ملاحظة إذا لم تنتبه للنتيجة.
<!-- let result = 10 / 0; console.log(result); -->
لهذا السبب، من الجيد دائمًا التحقق من القيم قبل القسمة، خاصة إذا كانت تأتي من المستخدم أو من مصدر خارجي. فهم سلوك JavaScript في القسمة يساعدك على كتابة كود أكثر أمانًا واستقرارًا.
عملية القسمة تُكمل مجموعة العمليات الحسابية الأساسية، ومع فهمها تصبح قادرًا على التعامل مع أغلب السيناريوهات العددية بثقة داخل برامجك.

باقي القسمة (%)
عملية باقي القسمة في JavaScript قد تبدو غريبة في البداية، لكنها من العمليات المهمة جدًا في البرمجة. هذه العملية لا تُرجع ناتج القسمة، بل تُرجع ما يتبقى بعد القسمة. بمعنى آخر، هي تخبرك هل الرقم انقسم بالكامل أم بقي جزء منه.
لفهم الفكرة بسهولة، تخيل أنك تريد توزيع 10 قطع حلوى على 3 أشخاص بالتساوي. كل شخص سيأخذ 3 قطع، وستبقى قطعة واحدة دون توزيع. هذه القطعة المتبقية هي بالضبط ما تُرجعه عملية باقي القسمة.
هذه العملية تُستخدم كثيرًا في البرمجة، خاصة عند التحقق من الأعداد الزوجية والفردية، تنظيم التكرار، أو تنفيذ سلوك معين كل عدد محدد من المرات. رغم بساطتها، إلا أنها تلعب دورًا مهمًا في بناء المنطق.
<!-- let result = 10 % 3; console.log(result); -->
في هذا المثال، ناتج القسمة هو 3، لكننا لا نهتم به هنا. ما يهمنا هو الباقي، وهو 1. JavaScript تُرجع هذا الباقي مباشرة.
من أشهر استخدامات هذه العملية هو التحقق مما إذا كان الرقم زوجيًا أو فرديًا. إذا كان باقي القسمة على 2 يساوي صفرًا، فالرقم زوجي، وإذا كان غير ذلك، فهو فردي. هذه فكرة بسيطة لكنها تُستخدم في عدد هائل من البرامج.
رغم أن العملية تبدو محدودة الاستخدام، إلا أنك ستجدها تظهر كثيرًا عندما تبدأ في العمل مع الحلقات، العدّ، وتنظيم التكرار. فهمها الآن سيجعل استيعاب تلك المفاهيم أسهل لاحقًا.
عملية باقي القسمة تُكمل صورة العمليات الحسابية الأساسية، وتفتح الباب أمام بناء منطق أكثر ذكاءً ودقة داخل JavaScript.

أولوية العمليات الحسابية
أحيانًا تكتب عملية حسابية وتتوقع نتيجة معينة، لكن JavaScript تعطيك نتيجة مختلفة تمامًا. في أغلب هذه الحالات، لا يكون الخطأ في القيم ولا في العمليات نفسها، بل في ترتيب تنفيذ العمليات. JavaScript، مثل الرياضيات، تتبع قواعد محددة تحدد أي عملية تُنفذ أولًا.
العمليات الحسابية لا تُنفذ من اليسار إلى اليمين بشكل عشوائي. هناك أولوية لبعض العمليات على غيرها. الضرب والقسمة لهما أولوية أعلى من الجمع والطرح. هذا يعني أن JavaScript تنفذ الضرب والقسمة أولًا، ثم تنتقل إلى الجمع والطرح.
هذا السلوك قد يسبب ارتباكًا للمبتدئ إذا لم يكن منتبهًا له. قد ترى تعبيرًا بسيطًا، لكن النتيجة لا تطابق ما حسبته ذهنيًا لأنك لم تأخذ أولوية العمليات بعين الاعتبار.
<!-- let result = 10 + 5 * 2; console.log(result); -->
في هذا المثال، JavaScript لا تجمع 10 و5 أولًا، بل تضرب 5 في 2 ثم تضيف الناتج إلى 10. النتيجة تكون 20، وليس 30. هذا السلوك منطقي إذا تذكرت قواعد أولوية العمليات.
إذا أردت تغيير ترتيب التنفيذ، يمكنك استخدام الأقواس. الأقواس تُجبر JavaScript على تنفيذ ما بداخلها أولًا، مهما كانت أولوية العمليات الأخرى. هذا الأسلوب يمنحك تحكمًا كاملًا في الحسابات.
<!-- let result = (10 + 5) * 2; console.log(result); -->
هنا تختلف النتيجة تمامًا، لأن الأقواس جعلت عملية الجمع تُنفذ أولًا. استخدام الأقواس لا يجعل الكود أوضح فقط، بل يمنع كثيرًا من الأخطاء غير المتوقعة.
فهم أولوية العمليات الحسابية مهم جدًا عند كتابة تعبيرات معقدة. كلما كان التعبير أوضح ومنظمًا، كانت النتيجة أسهل في التوقع والفهم.

العمليات الحسابية مع المتغيرات
بعد فهم العمليات الحسابية بشكل مستقل، نصل إلى المرحلة التي تبدأ فيها JavaScript بالتحول إلى أداة حقيقية لبناء منطق وبرامج مفيدة، وهي استخدام العمليات الحسابية مع المتغيرات. هنا لا نتعامل مع أرقام ثابتة فقط، بل مع قيم تتغير حسب المستخدم أو حسب سير البرنامج.
المتغيرات تسمح لنا بتخزين القيم ثم إجراء العمليات عليها في أي وقت. بدل إعادة كتابة الأرقام، نستخدم أسماء تعبّر عن المعنى، وهذا يجعل الكود أوضح وأسهل في القراءة والتعديل. كلما زاد اعتمادك على المتغيرات، أصبح الكود أكثر احترافية.
من الاستخدامات الشائعة هو تحديث قيمة متغير بناءً على قيمته السابقة. هذا الأسلوب يُستخدم في العدّ، التتبع، والحسابات التراكمية. JavaScript تسمح بذلك بسهولة، لأن المتغير يمكن أن يغيّر قيمته أثناء التنفيذ.
<!-- let counter = 0; counter = counter + 1; console.log(counter); counter = counter + 1; console.log(counter); -->
في هذا المثال، نلاحظ أن المتغير يبدأ بقيمة معينة، ثم يتم تحديثه اعتمادًا على قيمته السابقة. هذا النمط البسيط هو أساس العدّ والتكرار، ويُستخدم في عدد كبير من البرامج.
يمكن أيضًا استخدام العمليات الحسابية مع أكثر من متغير في تعبير واحد. هذا يسمح ببناء حسابات أكثر تعقيدًا، مثل حساب المجموع الكلي، المتوسط، أو أي قيمة مشتقة من عدة مدخلات.
<!-- let width = 5; let height = 10; let area = width * height; console.log(area); -->
هنا نرى كيف تتحول المتغيرات إلى أجزاء من معادلة واضحة. الكود يصبح أشبه بمعادلة رياضية مقروءة، وهذا ما يجعل JavaScript سهلة الفهم عند كتابتها بطريقة صحيحة.
العمل بالمتغيرات مع العمليات الحسابية هو النقطة التي تبدأ فيها ببناء منطق حقيقي، وليس مجرد تجارب. كل خطوة لاحقة في تعلم JavaScript ستعتمد على هذا الأساس.

أخطاء شائعة في العمليات الحسابية
رغم بساطة العمليات الحسابية في JavaScript، إلا أن كثيرًا من الأخطاء تظهر بسبب تفاصيل صغيرة يتم تجاهلها. هذه الأخطاء لا تكون غالبًا في الرموز نفسها، بل في نوع القيم المستخدمة أو في توقع نتيجة مختلفة عن منطق اللغة.
أكثر خطأ شائع هو الخلط بين الأرقام والنصوص. عندما تكون إحدى القيم نصية، خاصة مع عملية الجمع، تتغير النتيجة بالكامل. المبتدئ قد يظن أنه يجري عملية حسابية، بينما JavaScript تقوم بدمج نصوص، فيظهر ناتج غير متوقع.
خطأ آخر يتكرر هو الاعتماد على التحويل التلقائي دون انتباه. في الطرح أو الضرب أو القسمة، JavaScript تحاول تحويل النص إلى رقم، لكن إذا لم يكن النص صالحًا للتحويل، تكون النتيجة غير صالحة للحساب. هذا السلوك قد يمر دون ملاحظة إذا لم تتم مراجعة النتائج.
<!-- let a = "10"; let b = "five"; console.log(a - b); -->
في هذا المثال، JavaScript تحاول إجراء عملية طرح، لكنها لا تستطيع تحويل النص الثاني إلى رقم. النتيجة تكون غير صالحة للحساب، وهو أمر قد يربك المبتدئ إذا لم يكن منتبهًا لنوع البيانات.
من الأخطاء الشائعة أيضًا نسيان أولوية العمليات. كتابة تعبير يحتوي على أكثر من عملية دون أقواس قد يعطي نتيجة صحيحة أحيانًا بالصدفة، وخاطئة في حالات أخرى. الاعتماد على الأقواس يجعل النية واضحة ويمنع هذا النوع من الأخطاء.
أفضل طريقة لاكتشاف هذه الأخطاء هي الطباعة المستمرة للنتائج أثناء التعلم. لا تفترض أن النتيجة صحيحة، بل اطبعها وتحقق منها. هذه العادة البسيطة تختصر الكثير من الوقت والارتباك.
تذكر أن الخطأ هنا ليس فشلًا، بل خطوة في التعلم. كل مرة تفهم سبب نتيجة غير متوقعة، تقترب أكثر من فهم JavaScript بشكل عميق.
كيف تتدرب على العمليات الحسابية بشكل صحيح؟
التدرب على العمليات الحسابية في JavaScript لا يعني حل مسائل رياضية معقدة، بل يعني فهم كيف تتفاعل القيم مع العمليات داخل الكود. الهدف هنا هو أن تصبح النتائج متوقعة في ذهنك قبل تنفيذ الكود، وأن تفهم لماذا ظهرت هذه النتيجة بالذات.
ابدأ دائمًا بأمثلة صغيرة جدًا. جرّب جمع رقمين، ثم جرّب نفس العملية مع متغيرات. بعد ذلك، أدخل نصًا عن قصد وشاهد كيف تتغير النتيجة. هذه التجارب البسيطة تبني وعيًا قويًا بسلوك JavaScript.
حاول أيضًا دمج أكثر من عملية في تعبير واحد، واستخدم الأقواس لتغيير ترتيب التنفيذ. لا تتردد في تعديل الأمثلة ورؤية النتيجة في كل مرة. كل تغيير صغير هو تدريب حقيقي.
<!-- let a = 10; let b = 5; let c = 2; let result = (a + b) * c; console.log(result); -->
هذا المثال يجمع بين أكثر من عملية ويُظهر تأثير الأقواس على النتيجة. مثل هذه التمارين تساعدك على فهم أولوية العمليات بشكل عملي بدل حفظ القواعد نظريًا.
من الجيد أيضًا ربط العمليات الحسابية بسيناريوهات واقعية. احسب مجموع أسعار، متوسط درجات، أو عدد أيام. عندما يكون المثال قريبًا من الواقع، يصبح الفهم أسرع وأكثر ثباتًا.
لا تنتقل إلى مواضيع أكثر تقدمًا قبل أن تشعر بالراحة مع العمليات الحسابية. هذه العمليات هي الأساس الذي ستُبنى عليه الشروط، الحلقات، والدوال لاحقًا.
الخاتمة: العمليات الحسابية أساس المنطق البرمجي في JavaScript
العمليات الحسابية في JavaScript ليست مجرد رموز رياضية، بل أدوات لبناء منطق يفهم الأرقام ويتعامل معها بذكاء. كل برنامج حقيقي يعتمد على هذه العمليات بشكل أو بآخر، سواء كان بسيطًا أو معقدًا.
ما تعلمته في هذا المقال هو الأساس الذي سيمكنك من كتابة كود يتعامل مع القيم بثقة ووضوح. فهم الجمع، الطرح، الضرب، القسمة، وباقي القسمة يفتح أمامك بابًا واسعًا لبناء أفكار أكثر تقدمًا.
الخطوة التالية هي الاستمرار في التجربة. لا تكتفِ بالأمثلة، بل اكتب حساباتك الخاصة، وراقب النتائج، وافهم سبب كل نتيجة. هذه الممارسة هي ما يحول المعرفة إلى مهارة حقيقية.
عندما تصبح العمليات الحسابية طبيعية في تفكيرك، ستجد أن JavaScript أصبحت أكثر بساطة ومنطقية، وأن الانتقال إلى المفاهيم القادمة سيكون أسهل بكثير.
ديناس منصة تعليمية عربية