یک دستور 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");
```smart header="هر عبارتی میتواند به یکswitch/caseتبدیل شود" هم درswitchو هم درcase` میتوان از عبارتهای قراردادی استفاده کرد.
برای مثال:
let a = "1";
let b = 0;
switch (+a) {
case b + 1:
alert("این کد اجرا میشود چرا که +a برابر با 1 است و دقیقا با b+1 مساوی است");
break;
default:
alert('این اجرا نمیشود');
}
در اینجا +a برابر با 1 است و وقتی با b + 1 در case مقایسه میشود، کد متناظر اجرا میشود.
## گروهبندی "case"
چند `case` مختلف که یک کد دارند، میتواند با هم قرار بگیرند.
برای مثال اگر میخواهیم یک کد یکسان برای `case 3` و `case 5` اجرا شود:
```js run no-beautify
let a = 3;
switch (a) {
case 4:
alert('Right!');
break;
case 3: // (*) دو case را یک گروه میکنیم
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` وجود ندارد.
## نوع داده Type مهم است
اجازه دهید تاکید کنیم که چک برابری کاملا سختگیرانه است. مقدار هر دو باید از یک نوع داده باشد. درغیراین صورت با هم تطابق پیدا نمیکنند.
برای مثال کد زیر را در نظر بگیرید:
```js run
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' )
}
```
1. برای `0` و `1` اولین `alert` اجرا میشود.
2. برای `2` دومین `alert` اجرا میشود.
3. ولی برای `3` مقدار `prompt` یک string است و `"3"` با `3` با `===` برابر نیست. یعنی در `case 3` یک کد مرده داریم. و بههمین دلیل `default` اجرا میشود.


نظرات
<code>استفاده کنید، برای چندین خط – کد را درون تگ<pre>قرار دهید، برای بیش از ده خط کد – از یک جعبهٔ شنی استفاده کنید. (plnkr، jsbin، codepen…)