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

لماذا تعتبر الجمل الشرطية مهمة

تدفق التحكم (Control flow) هو العمود الفقري للمنطق. أنت تستخدم الجمل الشرطية للتحقق من صحة كلمات المرور قبل إرسالها إلى الخادم، وتتحقق مما إذا كانت عربة التسوق فارغة قبل حساب الضريبة، وتكتشف ما إذا كان طلب الشبكة قد فشل لتتمكن من إظهار خطأ بدلاً من شاشة فارغة. تعتمد كل هذه السيناريوهات على نفس الفكرة البسيطة: تقييم شيء ما، ثم التصرف بناءً على ذلك.

بدون الجمل الشرطية، سيكون تطبيقك عبارة عن مونولوج (حديث من طرف واحد) بدلاً من أن يكون حواراً؛ فلن يتمكن من التعامل مع سيناريوهات البيانات المختلفة، أو إدارة الأخطاء بسلاسة، أو التفاعل مع إجراءات المستخدم بأي طريقة ذات معنى. إنها تتيح لك التحكم في كيفية تشغيل برنامجك في ظل ظروف العالم الحقيقي غير المتوقعة.

جملة if الأساسية

أبسط مكان للبدء هو جملة if المستقلة. وهي تقول: إذا كان هذا الشيء صحيحاً، فقم بهذا العمل. هذا كل ما في الأمر؛ لا يوجد خيار احتياطي ولا مسار بديل.

if (x % 2 === 0) {
    console.log("Even");
}

في هذا المقتطف، يتحقق معامل باقي القسمة (modulus operator) مما إذا كان x يقبل القسمة على اثنين بدون باقٍ. عندما يكون الباقي صفراً، يقوم الكونسول بطباعة النص. أما إذا كان x عدداً فردياً، فلا يحدث شيء؛ حيث يتم تجاهل الكتلة ويستمر التنفيذ في السطور التالية.

هذا التجاهل الهادئ أمر مهم. فأحياناً تريد فقط حماية إجراء واحد فقط؛ ربما تريد إضافة فئة CSS إلى زر فقط عندما يكون نشطاً، أو إضافة عنصر إلى مصفوفة فقط عندما لا يكون الإدخال فارغاً. تتعامل جملة if المجردة مع تلك اللحظات دون إجبارك على كتابة منطق لا تحتاجه.

إضافة خيار بديل باستخدام if-else

القرارات الحقيقية عادة ما يكون لها جانبان: إما أن المستخدم كبير بما يكفي، أو أنه ليس كذلك؛ إما أن عملية الدفع نجحت، أو فشلت. وهيكل if-else يغطي كلا الحالتين.

if (age >= 18) {
    console.log("Adult");
} else {
    console.log("Not an Adult");
}

تقوم كتلة else بالتقاط كل ما رفضه الشرط الأول، مما يخلق تفرعاً ثنائياً نظيفاً. يعمل هذا النمط بشكل جيد مع مفاتيح التبديل (toggles)، والأذونات، وعلامات الميزات (feature flags). حافظ على تركيز المنطق داخل كل كتلة؛ فإذا وجدت نفسك تقوم بتكديس الكثير من المهام في تفرع واحد، فهذه عادةً إشارة إلى ضرورة تقسيم العمل إلى دوال أصغر.

التحقق من مسارات متعددة باستخدام else if

نادراً ما تقدم الحياة خيارين فقط. قد تحتاج إلى تصنيف رقم ما كعدد موجب، أو سالب، أو صفر. قد تقوم بتعيين سعر الشحن بناءً على فئات الوزن. لإجراء مقارنات متعددة ومرتبة، استخدم else if.

if (x > 0) {
    console.log("Positive");
} else if (x < 0) {
    console.log("Negative");
} else {
    console.log("Zero");
}

تقوم JavaScript بتقييم هذه الشروط من الأعلى إلى الأسفل. وبمجرد تحقق أحد الشروط، تقوم بتنفيذ تلك الكتلة وتتجاهل الباقي. الترتيب مهم هنا؛ فإذا قمت بالتحقق من x > 0 بعد التحقق من x > 100 ، فلن يتم تنفيذ التحقق الأكثر صرامة أبداً لأن التحقق الأقل صرامة سيلتقطه أولاً. فكر في else if كقائمة أولويات.

جملة switch

عندما تقارن قيمة واحدة بخيارات متعددة ومنفصلة، قد تبدو سلسلة طويلة من جمل else if متكررة ومملة. جملة switch تجعل الأمر أكثر تنظيماً، حيث تقوم بمطابقة تعبير ما مع بنود case وتشغيل الكتلة المطابقة.

switch (true) {
    case marks >= 90:
        Branch = "Computer science";
        break;
    case marks >= 80:
        Branch = "Mechanical";
        break;
    default:
        Branch = "Other";
}

يستخدم هذا المثال switch(true) لتقييم الشروط المنطقية (boolean) مباشرة، وهو نمط شائع في JavaScript عندما يعتمد منطقك على النطاقات بدلاً من المساواة التامة. كلمة break المفتاحية ضرورية للغاية؛ فبدونها، سيستمر التنفيذ وينتقل إلى الحالة التالية بغض النظر عما إذا كانت مطابقة أم لا، وهو أمر نادراً ما تريده هنا. أما بند default فيعمل مثل else النهائية، حيث يلتقط أي شيء لم يتناسب مع الحالات السابقة.

تتألق switch عندما يكون لديك خيارات واضحة وثابتة. وغالباً ما يكون من الأسهل مسحها بصرياً مقارنة بتكديس طويل من كتل else if ، خاصة عندما يقوم كل تفرع ببساطة بتعيين قيمة أو استدعاء دالة واحدة.

المعامل الثلاثي (Ternary Operator)

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

const result = (age >= 18) ? "Eligible" : "Not eligible";

يمكنك استخدامه لعمليات التعيين السريعة أو عمليات الإرجاع المضمنة (inline returns). وهو يعمل بشكل جيد عندما تكون النتيجة تعبيراً بسيطاً. لكن قاوم الرغبة في تداخل المعاملات الثلاثية لثلاثة مستويات؛ فقد يوفر المعامل الثلاثي المتداخل بعض الأسطر، ولكنه يضحي بوضوح الكود. عندما ينمو منطقك، ستكون كتلة if-else عادةً أكثر لطفاً مع المطور التالي الذي سيفتح الملف.

القرارات المتداخلة

يتطلب المنطق المعقد أحياناً طرح أسئلة متابعة. يمكنك تداخل جملة if داخل جملة if أخرى لتنقيح القرار.

if (weather === "sunny") {
    if (temp > 30) {
        console.log("