Switch Case (اختيار من عدة حالات)
أحيانًا يكون عندنا متغير واحد وله عدة قيم محتملة (مثل رقم يوم، نوع مستخدم، لون، خيار من قائمة). كتابة if/else كثيرة تصبح مزعجة وغير مرتبة. هنا يأتي دور switch.
متى نستخدم switch؟ ومتى نستخدم if؟
استخدم switch ✅
- عندك متغير واحد وتريد فحص قيم كثيرة
- القيم واضحة مثل: 1، 2، 3 أو "admin" و "user"
- تبغى كود مرتب وسهل القراءة
استخدم if ✅
- عندك شروط معقدة (أكبر/أصغر، شروط متعددة)
- تحتاج && و || كثير
- الشرط ليس مجرد مساواة لقيمة واحدة
شكل switch الأساسي
هذا شكل switch:
switch (value) {
case "A":
// نفّذ هذا إذا كانت value = "A"
break;
case "B":
// نفّذ هذا إذا كانت value = "B"
break;
default:
// إذا ولا حالة طابقت
}
مهم جدًا
- case = حالة ممكنة
- break = يوقف التنفيذ عند أول حالة تطابق
- default = مثل else (الخيار الأخير)
مثال عملي: رقم اليوم إلى اسم اليوم
تخيل عندنا رقم من 1 إلى 7 يمثل اليوم، ونريد تحويله لاسم اليوم.
let day = 5;
let dayName = "";
switch (day) {
case 1:
dayName = "الأحد";
break;
case 2:
dayName = "الإثنين";
break;
case 3:
dayName = "الثلاثاء";
break;
case 4:
dayName = "الأربعاء";
break;
case 5:
dayName = "الخميس";
break;
case 6:
dayName = "الجمعة";
break;
case 7:
dayName = "السبت";
break;
default:
dayName = "رقم يوم غير صحيح";
}
console.log(dayName);
ليش هذا المثال مفيد؟
لأنك بدل ما تكتب if/else كثيرة، جمعت كل الحالات في مكان واحد واضح.
مثال واقعي: صلاحيات المستخدم حسب النوع
تخيل عندك نوع مستخدم: admin أو editor أو user. تريد عرض رسالة مختلفة لكل نوع.
let role = "editor";
switch (role) {
case "admin":
console.log("أهلاً مدير النظام 👑");
break;
case "editor":
console.log("أهلاً بالمحرر ✍️");
break;
case "user":
console.log("أهلاً بك 👋");
break;
default:
console.log("نوع المستخدم غير معروف");
}
لاحظ: switch هنا مناسب جدًا لأننا نقارن نفس المتغير (role) مع قيم ثابتة.
حالة خاصة: دمج أكثر من case لنفس النتيجة
أحيانًا تريد أكثر من قيمة تؤدي لنفس النتيجة. هنا نكتب case فوق بعض بدون break:
let grade = "B";
switch (grade) {
case "A":
case "B":
console.log("مستواك ممتاز 👏");
break;
case "C":
console.log("مستواك جيد");
break;
default:
console.log("حاول مرة أخرى");
}
إيش صار هنا؟
إذا grade = A أو B… البرنامج يطبع نفس الرسالة ثم يتوقف عند break.
أخطاء شائعة في switch (انتبه!)
- نسيان break مما يجعل البرنامج يكمل حالات أخرى (Fall-through)
- كتابة قيم case بنوع مختلف (مثل رقم بدل نص أو العكس)
- نسيان default (مهم جدًا لمعالجة الحالات غير المتوقعة)
تذكير سريع:
switch يستخدم مقارنة “صارمة” في حالات كثيرة، لذلك انتبه لنوع البيانات (Number vs String).
switch أم if؟ متى أختار كلًّا منهما عمليًا
كثير من المبتدئين يحتارون: لماذا switch وعندنا if؟ من تجربتي، لكلٍّ موضعه الطبيعي. أستخدم switch حين يكون لديّ متغيّر واحد أقارن قيمته بعدة قيم محدّدة وواضحة — مثل رقم يوم، أو نوع مستخدم.
في هذه الحالة، switch أوضح وأسهل قراءة من سلسلة طويلة من else if. أما حين تكون الشروط معقّدة أو تتضمّن مقارنات بمدى (أكبر من، أصغر من)، فـ if هي الأنسب. القاعدة البسيطة: قيمة واحدة لها خيارات ثابتة كثيرة ← switch. شروط متنوّعة أو نطاقات ← if. هذا التمييز يجعل كودك أوضح لمن يقرأه.
تحذير من خبرتي: لا تنسَ break
أكثر خطأ يقع مع switch، ووقعت فيه شخصيًا في بداياتي، هو نسيان كلمة break في نهاية كل حالة. النتيجة سلوك غريب يسمّى Fall-through: ينفّذ البرنامج الحالة المطابقة ثم يستمر في تنفيذ الحالات التي تليها دون توقّف.
القاعدة: كل case ينتهي بـ break، إلا إذا كنت تقصد عمدًا دمج عدة حالات لتعطي النتيجة نفسها. ولا تنسَ حالة default للتعامل مع القيم غير المتوقّعة — أهملها كثيرون فانهارت برامجهم أمام إدخال لم يحسبوا له حسابًا.
ماذا بعد هذا الدرس؟
الدرس القادم: الحلقات (Loops) — for / while
سنبدأ نفهم كيف نكرر الأوامر بدل ما نكتب نفس الكود 50 مرة.