switch في JavaScript

من موسوعة حسوب

التعبير البرمجي switch يُستخدَم لمطابقة قيمة تعبير برمجي باستخدام عبارة case، ثم يُنفِّذ التعابير البرمجية المرتبطة معها.

البنية العامة

switch (expression) {
  case value1:
    // التعابير البرمجية التي ستُطبِّق
    // عندما تُطابِق قيمةُ التعبير قيمةَ الحالة
    [break;]
  case value2:
    // التعابير البرمجية التي ستُطبِّق
    // عندما تُطابِق قيمةُ التعبير قيمةَ الحالة
    [break;]
  ...
  case valueN:
    // التعابير البرمجية التي ستُطبِّق
    // عندما تُطابِق قيمةُ التعبير قيمةَ الحالة
    [break;]
  [default:
    // التعابير البرمجية التي ستُطبِّق
    // عندما لا تُطابِق قيمةُ التعبير أيّة حالة
    [break;]]
}

expression

التعبير الذي سيُطابَق مع كل حالة (case).

case valueN

القسم case الذي يُستخدَم لمطابقة التعبير expression، وإذا طابق التعبير expression القيمة valueN، فستُنفَّذ التعلميات داخل القسم case حتى نهاية التعبير البرمجي switch أو وجود التعبير break.

default

القسم default، وهو يوفِّر التعابير البرمجية التي يجب تطبيقها إن لم تُطابَق أيّة حالة case.

الوصف

تقبل switch تعبيرًا ثم ستبحث عن أوّل حالة case قيمتها تُطابِق قيمة التعبير تمامًا (باستخدام معامل المقارنة ===) ثم ستنقل التحكم إلى قسم case المُطابَق مما يؤدي إلى تنفيذ التعابير البرمجية المرتبطة به (وإذا كانت هنالك أكثر من حالة تُطابِق القيمة المعطاة، فستُحدَّد أوّل حالة فقط).

إذا لم تكن هنالك حالة case تُطابِق التعبير فسيبحث البرنامج عن قسم default، وإن وجِدَ فسيُنقَل التحكم إلى ذلك القسم، مما يؤدي إلى تنفيذ التعابير البرمجية المرتبطة به، وإن لم يكن قسم default موجودًا فسيُكمِل البرنامج تنفيذ التعابير البرمجية التي تلي نهاية switch؛ ومن الشائع وضع قسم default في نهاية switch لكن ذلك ليس ضروريًا.

تعبير break الاختياري يرتبط بإحدى الحالات وسيؤدي إلى خروج البرنامج من عبارة switch وإكمال تنفيذ التعليمات التي تلي switch؛ أما إذا لم يكن تعبير break موجودًا فسيكمل البرنامج تنفيذ التعبيرات البرمجية التي تلي الحالة المُطابَقة في switch.

أمثلة

استخدام switch

في المثال الآتي، إذا كانت قيمة التعبير expr تساوي Bananas، فسيُطابِق البرنامج الحالة Bananas وسيُنفِّذ التعابير البرمجية المرتبطة معها، وعند تنفيذ التعبير break فسيخرج البرنامج من switch ثم يُنفِّذ التعابير البرمجية التي تلي switch، وإذا حُذِفَ التعبير break فستُنفَّذ التعابير المرتبطة مع الحالة Cherries أيضًا:

switch (expr) {
  case 'Oranges':
    console.log('Oranges are $0.59 a pound.');
    break;
  case 'Apples':
    console.log('Apples are $0.32 a pound.');
    break;
  case 'Bananas':
    console.log('Bananas are $0.48 a pound.');
    break;
  case 'Cherries':
    console.log('Cherries are $3.00 a pound.');
    break;
  case 'Mangoes':
  case 'Papayas':
    console.log('Mangoes and papayas are $2.79 a pound.');
    break;
  default:
    console.log('Sorry, we are out of ' + expr + '.');
}

console.log("Is there anything else you'd like?");

نسيان وضع التعبير break

إذا نسيت وضع التعبير break فسينفِّذ البرنامج التعابير البرمجية التي تلي الحالة المُطابَقة، وسيستمر بتنفيذ التعابير البرمجية في الحالات الأخرى التي تلي الحالة المُطابَقة حتى لو لم يتحقق الشرط. فمثلًا:

var foo = 0;
switch (foo) {
  case -1:
    console.log('negative 1');
    break;
  case 0: // سيُطابَق الشرط لذا ستنفَّذ التعابير البرمجية هنا
    console.log(0);
    // نسينا وضع break
  case 1: // لم نخرج في الحالة الأولى، لذا سيستمر التنفيذ
    console.log(1);
    break; // لن ننتقل إلى تنفيذ الحالة التالية لوجود break
  case 2:
    console.log(2);
    break;
  default:
    console.log('default');
}

موضع الحالة الافتراضية

يمكن وضع الحالة الافتراضية default في أي مكان، وستُنفَّذ التعليمات التي تليها إن لم يُطابِق التعبير أحد الحالات:

var foo = 5;
switch (foo) {
  case 2:
    console.log(2);
    break;
  default:
    console.log('default')
    // ستُنفَّذ الحالة التالية لعدم وجود break
  case 1:  
    console.log('1');
}

استخدام switch بدلًا من عدِّة تعابير if

var a = 100;
var b = NaN;
switch (true) {
  case isNaN(a) || isNaN(b):
    console.log('NaNNaN');
    break;
  case a === b:
    console.log(0);
    break;
  case a < b:
    console.log(-1);
    break;
  default:
    console.log(1);
}

تنفيذ تعابير برمجية عند مطابقة حالة أو أكثر

يمكن الاستفادة من سلوك switch عند عدم توافر التعبير break بإمكانية تنفيذ عملية ما إذا تمت مطابقة حالة أو أكثر:

var Animal = 'Giraffe';
switch (Animal) {
  case 'Cow':
  case 'Giraffe':
  case 'Dog':
  case 'Sheep':
    console.log('This animal is cute.');
    break;
  case 'Dinosaur':
  default:
    console.log('This animal is NOT!.');
}

تنفيذ سلسلة من التعابير

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

var foo = 1;
var output = 'Output: ';
switch (foo) {
  case 10:
    output += 'So ';
  case 1:
    output += 'What ';
    output += 'Is ';
  case 2:
    output += 'Your ';
  case 3:
    output += 'Name';
  case 4:
    output += '?';
    console.log(output);
    break;
  case 5:
    output += '!';
    console.log(output);
    break;
  default:
    console.log('Please pick a number from 0 to 6!');
}

ناتج المثال السابق:

القيمة الناتج
قيمة المتغير foo هي NaN أو ليست 1 أو 2 أو 3 أو 4 أو 5 أو 10 Please pick a number from 0 to 6!‎
10 So What Is Your Name?‎
1 What Is Your Name?‎
2 Your Name?‎
3 Name?‎
4 ?‎
5 !

دعم المتصفحات

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي نعم نعم نعم نعم نعم

مصادر ومواصفات