يمكن أن تحل عبارة switch
if
عمليات التحقق المتعددة.
إنه يوفر طريقة وصفية أكثر لمقارنة قيمة بمتغيرات متعددة.
يحتوي switch
على كتلة case
واحدة أو أكثر وافتراضي اختياري.
يبدو مثل هذا:
التبديل (خ) { الحالة 'القيمة1': // إذا (x === 'القيمة1') ... [استراحة] الحالة 'القيمة2': // إذا (x === 'القيمة2') ... [استراحة] تقصير: ... [استراحة] }
يتم التحقق من قيمة x
للتأكد من أنها تساوي تمامًا القيمة من case
الأولى (أي value1
) ثم إلى الحالة الثانية ( value2
) وهكذا.
إذا تم العثور على المساواة، يبدأ switch
في تنفيذ التعليمات البرمجية بدءًا من case
المقابلة، حتى أقرب break
(أو حتى نهاية switch
).
إذا لم تتم مطابقة أي حالة، فسيتم تنفيذ الكود default
(إذا كان موجودًا).
مثال على switch
(يتم تمييز الكود الذي تم تنفيذه):
دع أ = 2 + 2؛ التبديل (أ) { الحالة 3: تنبيه ("صغير جدًا")؛ استراحة؛ الحالة 4: تنبيه ("بالضبط!")؛ استراحة؛ الحالة 5: تنبيه ("كبير جدًا")؛ استراحة؛ تقصير: تنبيه ("لا أعرف مثل هذه القيم")؛ }
هنا يبدأ switch
في مقارنة a
case
الأول وهو 3
. المباراة فشلت.
ثم 4
. هذه تطابق، لذا يبدأ التنفيذ من case 4
حتى أقرب break
.
إذا لم يكن هناك break
، فسيستمر التنفيذ مع case
التالية دون أي فحوصات.
مثال بدون break
:
دع أ = 2 + 2؛ التبديل (أ) { الحالة 3: تنبيه ("صغير جدًا")؛ الحالة 4: تنبيه ("بالضبط!")؛ الحالة 5: تنبيه ("كبير جدًا")؛ تقصير: تنبيه ("لا أعرف مثل هذه القيم")؛ }
في المثال أعلاه، سنرى التنفيذ المتسلسل لثلاثة alert
:
تنبيه ("بالضبط!")؛ تنبيه ("كبير جدًا")؛ تنبيه ("لا أعرف مثل هذه القيم")؛
يمكن لأي تعبير أن يكون وسيطة switch/case
يسمح كل من switch
case
بالتعبيرات التعسفية.
على سبيل المثال:
دع = "1"؛ دع ب = 0؛ التبديل (+أ) { الحالة ب + 1: تنبيه ("يتم تنفيذ هذا، لأن +a هو 1، يساوي بالضبط b+1"); استراحة؛ تقصير: تنبيه ("هذا لا يعمل")؛ }
هنا +a
يعطي 1
، مقارنة بـ b + 1
في case
، ويتم تنفيذ الكود المقابل.
يمكن تجميع العديد من أنواع case
التي تشترك في نفس الرمز.
على سبيل المثال، إذا أردنا تشغيل نفس الكود case 3
والحالة case 5
:
دع = 3؛ التبديل (أ) { الحالة 4: تنبيه ("صحيح!")؛ استراحة؛ الحالة 3: // (*) جمعت حالتين الحالة 5: تنبيه ("خطأ!")؛ تنبيه("لماذا لا تحضر دروس الرياضيات؟"); استراحة؛ تقصير: تنبيه('النتيجة غريبة. حقا.'); }
الآن يعرض كلا الرقمين 3
و 5
نفس الرسالة.
تعد القدرة على "تجميع" الحالات أحد الآثار الجانبية لكيفية عمل switch/case
دون break
. هنا يبدأ تنفيذ case 3
من السطر (*)
ويمر case 5
، لأنه لا يوجد break
.
دعونا نؤكد على أن التحقق من المساواة يكون دائمًا صارمًا. يجب أن تكون القيم من نفس النوع للمطابقة.
على سبيل المثال، دعونا نفكر في الكود:
Let arg = موجه("أدخل قيمة؟"); التبديل (أرج) { الحالة '0': الحالة '1': تنبيه ("واحد أو صفر")؛ استراحة؛ الحالة '2': تنبيه("اثنان"); استراحة؛ الحالة 3: تنبيه ("لا يتم التنفيذ أبدًا!" ); استراحة؛ تقصير: تنبيه ("قيمة غير معروفة")؛ }
بالنسبة إلى 0
، 1
، يتم تشغيل alert
الأول.
لمدة 2
يتم تشغيل alert
الثاني.
لكن بالنسبة لـ 3
، فإن نتيجة prompt
هي سلسلة نصية "3"
، وهي لا تساوي تمامًا ===
الرقم 3
. إذن لدينا رمز ميت في case 3
! سيتم تنفيذ المتغير default
.
الأهمية: 5
اكتب الكود باستخدام if..else
والذي يتوافق مع switch
التالي:
التبديل (المتصفح) { حالة "الحافة": تنبيه("لقد حصلت على الحافة!" ); استراحة؛ حالة "كروم": حالة "فايرفوكس": حالة "سفاري": حالة "الأوبرا": تنبيه ("حسنًا، نحن ندعم هذه المتصفحات أيضًا")؛ استراحة؛ تقصير: تنبيه("نأمل أن تبدو هذه الصفحة على ما يرام!" ); }
لمطابقة وظيفة switch
بدقة، if
استخدام مقارنة صارمة '==='
.
بالنسبة للسلاسل المعطاة، يعمل الرمز '=='
البسيط أيضًا.
إذا (المتصفح == 'الحافة') { تنبيه("لقد حصلت على الحافة!"); } وإلا إذا (المتصفح == 'Chrome' || المتصفح == "فايرفوكس" || المتصفح == "سفاري" || المتصفح == 'الأوبرا') { تنبيه ("حسنًا، نحن ندعم هذه المتصفحات أيضًا")؛ } آخر { تنبيه("نأمل أن تبدو هذه الصفحة على ما يرام!" ); }
يرجى ملاحظة: browser == 'Chrome' || browser == 'Firefox' …
مقسم إلى أسطر متعددة لتسهيل القراءة.
لكن بناء switch
لا يزال أنظف وأكثر وصفًا.
الأهمية: 4
أعد كتابة الكود أدناه باستخدام عبارة switch
واحدة:
Let a = +prompt('a?', ''); إذا (أ == 0) { تنبيه(0); } إذا (أ == 1) { تنبيه(1); } إذا (أ == 2 || أ == 3) { تنبيه('2,3'); }
يتحول الشيكان الأولان إلى case
. والفحص الثالث ينقسم إلى حالتين:
Let a = +prompt('a?', ''); التبديل (أ) { الحالة 0: تنبيه(0); استراحة؛ الحالة 1: تنبيه(1); استراحة؛ الحالة 2: الحالة 3: تنبيه('2,3'); استراحة؛ }
يرجى ملاحظة: break
في الأسفل غير مطلوبة. لكننا وضعناها لجعل الكود مقاومًا للمستقبل.
في المستقبل، هناك احتمال أن نرغب في إضافة case
أخرى، على سبيل المثال case 4
. وإذا نسينا إضافة فاصل قبله، في نهاية case 3
، سيكون هناك خطأ. لذلك هذا نوع من التأمين الذاتي.