Menu
العربية

جملة switch في JavaScript: case وbreak وdefault

شرح عملي لجملة switch في JavaScript: الحالات case، الأمر break، الحالة الافتراضية default، ظاهرة fallthrough، ومتى يكون switch أفضل من سلسلة if/else.

جملة switch في جافا سكريبت: اختيار فرع واحد من عدة خيارات

تُستخدم switch في جافا سكريبت للتحكم بمسار التنفيذ عندما تريد مقارنة قيمة واحدة بعدد محدود من الاحتمالات المعروفة. صحيح أنه بإمكانك الحصول على النتيجة نفسها باستخدام سلسلة من if/else if/else، لكن حين تجد نفسك تفحص المتغير ذاته ثلاث أو أربع مرات متتالية، تصبح switch أوضح وأسهل قراءة.

الشكل العام للجملة:

index.js
Output
Click Run to see the output here.

لو قرأنا الكود من الأعلى إلى الأسفل: تقوم جافا سكريبت بتقييم قيمة day، ثم تقارنها بكل قيمة case على التوالي، وتنفّذ الكتلة المطابقة. أما default فيلتقط أي قيمة لم تطابق أيًّا من الحالات، تمامًا مثل else الأخيرة. ترتيب القراءة يكون: القيمةالحالةالكود.

كيف تتم المطابقة فعليًا في switch case

تعتمد جملة switch في جافا سكريبت على المساواة الصارمة، أي العامل ===. لا يوجد أي تحويل تلقائي للأنواع ولا مطابقات تقريبية. فمثلًا case 1: يطابق الرقم 1 فقط، ولا يطابق النص "1" إطلاقًا.

index.js
Output
Click Run to see the output here.

فقط الحالة الثانية هي التي تتطابق. فإذا صادفتك يومًا مفاجأة وهي أن switch لا يعمل كما تتوقّع، فالسبب الغالب هو اختلاف بين نص (string) ورقم (number) قادم من حقل نموذج أو من معامل في الرابط.

كلمة break هي التي توقف التنفيذ

هنا تكمن النقطة التي يقع فيها كثير من المطوّرين. فوسم case ليس كتلة مستقلة بذاتها، بل مجرد نقطة قفز. فبمجرد أن يصل التنفيذ إلى حالة مطابقة، يستمر في تنفيذ الأسطر واحدًا تلو الآخر — متجاوزًا حتى وسم الحالة التالية — إلى أن يصادف break أو return أو تنتهي جملة switch.

لاحظ ما يحدث عند غياب break:

index.js
Output
Click Run to see the output here.

القيمة المطابقة هنا هي "editor"، ومع ذلك تظهر لك الرسائل يمكنه التعديل و يمكنه المشاهدة و تم تسجيل الدخول كلّها دفعة واحدة. هذه هي ظاهرة fallthrough في switch: التنفيذ يتسرّب إلى الحالات التي تليها لأنّه لا يوجد ما يوقفه.

أضِف break وسترى أنّ السلوك يعود إلى طبيعته:

index.js
Output
Click Run to see the output here.

عادة مهمة: اختم كل case بـ break، إلا إذا كنت تقصد فعلًا استخدام fallthrough.

استخدام fallthrough المتعمد لتجميع الحالات

الـ fallthrough في جافا سكريبت ليس خطأً دائمًا. بل إن حذف break يُعدّ طريقة أنيقة للقول: "كل هذه الحالات تنفّذ نفس الشيء":

index.js
Output
Click Run to see the output here.

تتشارك تسميات case الفارغة المتراصّة نفس الكتلة البرمجية التي تليها. لاحظ أنه لا حاجة لاستخدام break بعد return، لأن الدالة تخرج بالكامل عند تنفيذه. فاستخدام return داخل switch يتجاوز كل ما يأتي بعده.

أما عندما ترغب فعلاً في حدوث fallthrough بين حالات غير فارغة، فاترك تعليقاً يوضّح ذلك حتى لا يأتي من بعدك ويظنّها خطأً ويُصلحها:

index.js
Output
Click Run to see the output here.

لا يُشترط أن يأتي default في النهاية

العُرف السائد هو وضع default في آخر جملة switch، وهذا ما يتوقّعه معظم القرّاء. لكن من الناحية التقنية، default مجرّد تسمية (label) كغيرها — يُنفَّذ عندما لا تتطابق أيّ case، أينما وُضع. فلو وضعته في المنتصف دون break، سيحدث fallthrough وينزلق التنفيذ إلى ما يليه من حالات. ضعه في الأخير، واختمه بـ break (أو اتركه دون ذلك، ما دام ليس بعده شيء)، وستشكر نفسك لاحقًا على هذا الاختيار.

index.js
Output
Click Run to see the output here.

نطاق المتغيرات داخل الـ case

كل الحالات في جملة switch تتشارك نطاقاً واحداً — وهو نطاق الكتلة الخاصة بالـ switch كله. لذلك لو حاولت تعريف متغيّر بـ let أو const بنفس الاسم في حالتين مختلفتين، ستحصل على خطأ إعادة تعريف:

switch (x) {
    case 1:
        let msg = "واحد";
        break;
    case 2:
        let msg = "اثنان";   // SyntaxError: Identifier 'msg' has already been declared
        break;
}

الحل هو إحاطة جسم كل حالة بكتلة خاصة باستخدام { }:

index.js
Output
Click Run to see the output here.

الآن صار لكل msg نطاقه الخاص، وانتهت مشكلة التعارض. احفظ هذه الحيلة كلما احتجت أن يضم الـ case أكثر من سطر أو سطرين من المنطق.

الفرق بين switch و if else

تتألق جملة switch في جافا سكريبت حين تختبر قيمة واحدة مقابل عدة احتمالات ثابتة: أكواد HTTP، أو أنواع الـ actions في Redux، أو أسماء أوامر، أو نصوص أشبه بالـ enum. تظهر القيمة مرة واحدة في الأعلى، وتنساب عين القارئ على الـ case labels وكأنها فهرس محتويات.

أما if/else فهو الأنسب في الحالات التالية:

  • حين تقارن نطاقات مثل (score >= 90, score >= 75).
  • حين تتضمن الشروط متغيرات مختلفة أو تعابير منطقية متعددة.
  • حين تحتاج إلى مساواة مرنة أو مقارنات مخصصة، لأن switch يعتمد دائمًا على المساواة الصارمة ===.
index.js
Output
Click Run to see the output here.

البديل الحديث الشائع للنمط الأول هو استخدام كائن (object) كجدول بحث:

index.js
Output
Click Run to see the output here.

ثلاثة أسطر بدلًا من switch من تسعة أسطر. لمّا تكون الحالات مجرد ربط بيانات بلا منطق حقيقي، عادةً ما يكون الكائن (أو Map) أوضح في القراءة. خلّي switch للحالات اللي فيها عمل فعلي في كل حالة.

الخطوة التالية: حلقات for

جملة switch تتعامل مع قرار واحد له عدة خيارات. أما الأداة التالية في التحكم بتدفق التنفيذ فهي التكرار — أي تنفيذ نفس الكتلة البرمجية مرارًا وتكرارًا. وهذا بالضبط ما تقدّمه حلقة for، وهي موضوعنا القادم.

الأسئلة الشائعة

كيف تعمل جملة switch في JavaScript؟

تقوم switch بمقارنة قيمة واحدة بسلسلة من الحالات case باستخدام المساواة الصارمة (===)، وعند أول تطابق تبدأ بتنفيذ الكود الخاص بتلك الحالة وتستمر في التنفيذ حتى تصل إلى break أو إلى نهاية الكتلة. ويمكن إضافة default اختيارية تُنفَّذ عندما لا تتطابق أي حالة.

ما هو الـ fallthrough في switch؟

إذا لم تنتهِ الحالة case بـ break (أو return)، فإن التنفيذ يتسرّب إلى الحالة التالية ويُشغّل كودها حتى لو لم تتطابق قيمتها. هذا السلوك مفيد أحيانًا لتجميع حالات تشترك في نفس المنطق، لكنه في الغالب مصدر للأخطاء. لذلك من الأفضل إنهاء كل case بـ break إلا إذا كنت تقصد التسرّب فعلًا.

متى أستخدم switch بدلًا من if/else في JavaScript؟

استخدم switch عندما تقارن قيمة واحدة بعدة خيارات ثابتة، مثل أكواد حالة HTTP أو أنواع الـ actions أو أوامر نصية محددة. أما if/else فهي الأنسب عند التعامل مع مجالات (ranges) أو عدة متغيرات أو تعابير منطقية مركّبة. وانتبه إلى أن switch تستخدم المساواة الصارمة، فـ case '1' لن يتطابق مع الرقم 1.

تعلّم البرمجة مع Coddy

ابدأ الآن