جاوااسکریپت علاوه بر دستور شرطی if، دستور switch هم دارد که برای اجرای شرطی منطق به کار میرود.
از آن زمانی استفاده میشود که یک متغیر باید با چند حالت مختلف مقایسه شود.
این مقایسه با بررسی برابری دقیق (===) انجام میشود؛ به مفهوم مقایسه نگاه کنید.
دستور switch در جاوااسکریپت برای متغیری مانند x نحوهی نگارش زیر را دارد.
switch (x) {
case option1:
// code that is executed when "x === option1" is true
break;
case option2:
// code that is executed when "x === option2" is true
break;
default:
// code that is executed when x does not equal any of the
// options
}
حالت default اختیاری است و زمانی به کار میرود که بخواهید اگر هیچیک از گزینههای دیگر با متغیر مطابقت نداشت، قطعه کدی را اجرا کنید.
دستورهای break بالا لازماند، چون در جاوااسکریپت بهصورت پیشفرض همهی حالتها «عبور» میکنند.
یعنی بدون هیچ دستور break، همهی کدهای حالتهای زیرِ اولین گزینهی منطبق اجرا میشوند، حتی اگر x با آن حالتها مطابقت نداشته باشد.
این رفتار «عبور پیشفرض» یکی از دامهای رایج هنگام استفاده از switch در جاوااسکریپت است.
داخل یک تابع، برای پرهیز از این مشکل میتوان بهجای break از return هم استفاده کرد.
وقتی میخواهید یک کد یکسان را برای چند حالت به کار ببرید، میتوانید از رفتار عبور به نفع خودتان استفاده کنید. نمونهای از این را میتوانید در مستندات MDN ببینید.
بهصورت پیشفرض، متغیرهای موجود در دستورهای case مختلف، دامنهی یکسانی دارند.
این میتواند به رفتار غیرمنتظره منجر شود.
برای مثال، اگر یک حالت را کپی و جایگذاری کنید، ممکن است در دو حالت اعلان let message داشته باشید که به خطا منجر میشود؛ مستندات MDN را ببینید.
برای پرهیز از مشکلات ناشی از دامنهی مشترک، میتوانید برای هر دستور case با افزودن یک بلوک کد با آکولاد، دامنهای جداگانه بسازید.
switch (x) {
case option1: {
// Variables declared here are contained to this case.
break;
}
case option2: {
// ...
break;
}
default: {
// ...
}
}
بهجای متغیر x میتوانید از یک عبارت هم استفاده کنید.
این عبارت یک بار در ابتدای دستور switch ارزیابی میشود و نتیجهی آن با حالتها مقایسه میشود.
کاربرد رایج این، «سوییچ نوع» است که بسته به نوع متغیر، کد متفاوتی اجرا میکند.
switch (typeof x) {
case 'string':
// code that is executed when x is a string
break;
case 'number':
// code that is executed when x is a number
break;
default:
// code that is executed when x has some other type
}
گزینهها خودشان هم میتوانند عبارت باشند.