یک دستور switch میتواند جایگزین چند if پشت سر هم بشود.
این دستور توصیف یک متغیر که میتواند چند مقدار داشته باشد را راحتتر میکند.
The syntax
یک دستور switch یک یا چند بلوک case دارد و میتوان برای آن یک مقدار اختیاری پیشفرض تعریف کرد.
و بدین شکل نوشته میشود:
switch(x) {
case 'value1': // if (x === 'value1')
...
[break]
case 'value2': // if (x === 'value2')
...
[break]
default:
...
[break]
}
- در این مرحله چک میشود که مقدار
xدقیقا با مقدارcaseاول برابر باشد. که اینجا مقدار آنvalue1است. سپس برابر بودن آن با (value2) چک میشود و به همین ترتیب ادامه پیدا میکند. - اگر مقدار برابری پیدا کند،
switch، کد داخلcaseمورد نظر را اجرا میکند. و تا زمانی که به نزدیکترینbreakبرسد یا به پایانswitchبرسد این کار را ادامه میدهد. - اگر با هیچکدام از
caseها جور نشود، کدdefaultاجرا میشود. البته اگر وجود داشته باشد.
یک مثال
یک مثال از دستور switch (کد اجرا شده هایلایت شده است):
let a = 2 + 2;
switch (a) {
case 3:
alert( 'Too small' );
break;
case 4:
alert("Exactly!");
break;
case 5:
alert( 'Too big' );
break;
default:
alert( "I don't know such values" );
}
در اینجا دستور switch با مقایسهی a با case اول شروع میکند. که در اینجا مقدار آن 3 است و تطابق ندارند.
سپس به سراغ 4 میرود. این یکی برابر است و تطابق پیدا میکند. پس اجرای کد از case 4 شروع میشود و تا نزدیکترین break ادامه مییابد.
اگر break وجود نداشته باشد، caseهای بعدی هم اجرا میشوند.
یک مثال بدون break:
let a = 2 + 2;
switch (a) {
case 3:
alert( 'Too small' );
case 4:
alert( 'Exactly!' );
case 5:
alert( 'Too big' );
default:
alert( "I don't know such values" );
}
در مثال بالا هر سه alert بهترتیب اجرا خواهند شد:
alert('Exactly!');
alert('Too big');
alert("I don't know such values");
switch/case تبدیل شودهم در switch و هم در case میتوان از عبارتهای قراردادی استفاده کرد.
برای مثال:
let a = "1";
let b = 0;
switch (+a) {
case b + 1:
alert("this runs, because +a is 1, exactly equals b+1");
break;
default:
alert("this doesn't run");
}
در اینجا a+ برابر با 1 است و وقتی با b + 1 در case مقایسه میشود، کد متناظر اجرا میشود.
گروهبندی “case”
چند case مختلف که یک کد دارند، میتواند با هم قرار بگیرند.
برای مثال اگر میخواهیم یک کد یکسان برای case 3 و case 5 اجرا شود:
let a = 3;
switch (a) {
case 4:
alert('Right!');
break;
case 3: // (*) grouped two cases
case 5:
alert('Wrong!');
alert("Why don't you take a math class?");
break;
default:
alert('The result is strange. Really.');
}
حالا 3 و 5 پیام یکسانی نمایش میدهند.
این توانایی که میتوان caseهای مختلف را گروهبندی کرد، به این خاطر است که switch/case چگونه بدون break کار میکند. اینجا اجرای کد case 3 از خط (*) شروع میشود و تا خط case 5 ادامه پیدا میکند. چرا که هیچ break وجود ندارد.
نوع داده مهم است
اجازه دهید تاکید کنیم که بررسی برابری کاملا سختگیرانه است. مقدار هر دو باید از یک نوع داده باشد. در غیر این صورت با هم تطابق پیدا نمیکنند.
برای مثال کد زیر را در نظر بگیرید:
let arg = prompt("Enter a value?");
switch (arg) {
case '0':
case '1':
alert( 'One or zero' );
break;
case '2':
alert( 'Two' );
break;
case 3:
alert( 'Never executes!' );
break;
default:
alert( 'An unknown value' )
}
- برای
0و1اولینalertاجرا میشود. - برای
2دومینalertاجرا میشود. - ولی برای
3مقدارpromptیک string است و"3"با3با===برابر نیست. یعنی درcase 3یک کد مرده داریم. و بههمین دلیلdefaultاجرا میشود.
نظرات
<code>استفاده کنید، برای چندین خط – کد را درون تگ<pre>قرار دهید، برای بیش از ده خط کد – از یک جعبهٔ شنی استفاده کنید. (plnkr، jsbin، codepen…)