دستور switch case در جاوا اسکریپت

همانطور که در فصل قبل دیدید، شما میتوانید از چندین دستور if...else…if برای اعمال چندین شرط استفاده کنید. با این حال این همیشه بهترین راه نیست ، به خصوص وقتی که تمام شروط شما به یک مقدار از یک متغیر بستگی داشته باشد. از javaScript (جاوا اسکریپت) نسخه 1.2 تاکنون شما میتوانید از یک دستور switch استفاده کنید که دقیقا این گونه موارد را مدیریت میکند.


فلوچارت دستور switch case

در فلوچارت شکل زیر نحوه ی عملکرد یک دستور switch-case نشان داده شده است.


switch_case


قاعده ی نوشتاری

هدف یک دستور switch مشخص کردن یک عبارت برای ارزیابی و تعیین چندین جمله ای است که بر اساس مقدار این عبارت اجرا میشوند. مفسر هرکدام از case ها را با مقدار عبارت دستور switch تا رسیدن به گزینه ی مورد نظر مقایسه میکند. اگر هیچ گزینه ای پیدا نشود ، یک شرط پیشفرض (default) اجرا خواهد شد :

switch (expression)
{
   case condition 1: statement(s)
   break;
   
   case condition 2: statement(s)
   break;
   ...
   
   case condition n: statement(s)
   break;
   
   default: statement(s)
}

دستور break پایان هر case مشخص را تعیین میکند. اگر break ها جا انداخته شوند مفسر به اجرای دستور هر یک از case های زیرین تا پایان ادامه خواهد داد.

ما دستور break را به صورت مفصل در فصل حلقه ها توضیح خواهیم داد.

 

نمونه مثال زیر نحوه ی پیاده سازی دستور switch-case را نشان میدهد :

<html>
   <body>
   
      <script type="text/javascript">
        
            var grade='A';
            document.write("Entering switch block<br />");
            switch (grade)
            {
               case 'A': document.write("Good job<br />");
               break;
            
               case 'B': document.write("Pretty good<br />");
               break;
            
               case 'C': document.write("Passed<br />");
               break;
            
               case 'D': document.write("Not so good<br />");
               break;
            
               case 'F': document.write("Failed<br />");
               break;
            
               default:  document.write("Unknown grade<br />")
            }
            document.write("Exiting switch block");
        
      </script>
     
   </body>
</html>

خروجی به شکل زیر است :

Entering switch block
Good job
Exiting switch block

دستور break نقش عمده ای در اجرای صحیح دستور switch دارد. به نمونه مثال زیر توجه کنید، در این مثال از هیچ دستور break ایی استفاده نشده است :

<html>
   <body>
      
      <script type="text/javascript">
         
            var grade='A';
            document.write("Entering switch block<br />");
            switch (grade)
            {
               case 'A': document.write("Good job<br />");
               case 'B': document.write("Pretty good<br />");
               case 'C': document.write("Passed<br />");
               case 'D': document.write("Not so good<br />");
               case 'F': document.write("Failed<br />");
               default: document.write("Unknown grade<br />")
            }
            document.write("Exiting switch block");
         
      </script>
      
   </body>
</html>

خروجی به شکل زیر است :

Entering switch block
Good job
Pretty good
Passed
Not so good
Failed
Unknown grade
Exiting switch block

همانطور که مشاهده میکنید با وجود اینکه متغیر grade دارای مقدار A است، به دلیل نبود دستور break در case ها تمام دستورات اجرا شده است.


بروزرسانی مقاله ی دستور switch case در جاوا اسکریپت :  منتشر شده در ۲۵ خرداد ۱۳۹۷ 

عبارت switch را می توان جایگزینی برای چندین if متوالی دانست. عبارت switch روشی به مراتب بهتر از if برای مقایسه مقادیر و انتخاب عملی مناسب است.

قاعده نوشتاری عبارت switch 

عبارت switch شامل یک یا چندین بلاک می‌شود که با کلمه رزرو شده case مشخص میشوند. این عبارت شامل قسمتی اختیاری نیز هست که با کلمه رزرو شده default متمایز می‌گردد. قاعده نوشتاری عبارت switch به شکل زیر است :

switch(x) {
  case 'value1':  // if (x === 'value1')
    ...
    [break]

  case 'value2':  // if (x === 'value2')
    ...
    [break]

  default:
    ...
    [break]
}
  • مقدار x مشخص شده در این عبارت با مقادیری که درست بعد از کلمه های case مشخص شده‌اند به ترتیب مقایسه می‌شود (در اینجا value1 و value2)
  • اگر مقادیری که مقایسه می‌شوند معادل باشند، بدنه ی مربوط به case مورد نظر اجرا خواهد شد. این اجرا ، تا رسیدن به کلمه break ادامه دارد. کلمه break کار خروج از  از  عبارت switch را انجام میدهد.
  • اگر هیچ کدام از مقادیر مربوط به case ها معادل مقدار x نباشند، قسمت مربوط به default اجرا می‌شود.

 
در زیر یک مثال واقعی از عبارت switch آورده شده است :

let a = 2 + 2;

switch (a) {
  case 3:
    alert( 'Too small' );
    break;
  case 4:
    alert( 'Exactly!' );
    break;
  case 5:
    alert( 'Too large' );
    break;
  default:
    alert( "I don't know such values" );
}

در اینجا عبارت switch شروع به مقایسه مقدار a با هر کدام از مقادیر مقابل case ها می‌کند. در این مورد دستورات بدنه ی case دوم اجرا شده و سپس عملیات خروج از switch با استفاده از دستور break انجام میشود.

در صورتی که انتهای بدنه case مورد نظر فاقد دستور 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 اجازه عبارت های اختیاری را می دهند. برای مثال :

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+ مقدار عددی ۱ را نتیجه می دهد. این مقدار با عبارت b + 1 مقایسه شده و در نتیجه بدنه این case اجرا خواهد شد.


گروه بندی عبارات case

ممکن است چندین case شامل دستورات بدنه ی یکسانی باشند. در این صورت می توان از گروه بندی عبارت case استفاده کرد. برای مثال اگر بخواهیم کد یکسانی برای case 3 و case 5 اجرا شود :

let a = 2 + 2;

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.');
}

اکنون مقادیر ۳ و ۵ هر دو پیغام مشابهی را نشان می دهند.


اهمیت انواع در عبارت جایگزین

باید دقت داشت که عملیات مقایسه در عبارت switch به صورت مطلق انجام می‌پذیرد. این بدان معناست که معادل بودند مقدار کافی نیست بلکه نوع دو مقدار نیز باید یکسان باشند. به نمونه مثال زیر توجه کنید :

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 اجرا می شود.
  • برای مقدار ۲ دومین alert اجرا می شود.
  • برای مقدار ۳ دستور alert سوم اجرا نمی‌شود. زیرا "3" و 3 یکسان نیستند.
منتشر شده در ۱۷ مهر ۱۳۹۶ حمید رضا ملکی ۳۴۶۱ بازدید
دیدگاه ها
Sepehr Aghdasi سه شنبه ۲۲ مرداد ۱۳۹۸

سلام استاد ممنون از اموزش اینجا یک سوالی پیش میاد فرق var با let چی هست؟ ایا میشه فقط var استفاده کرد به جای let ؟

حمید رضا ملکی چهار شنبه ۲۳ مرداد ۱۳۹۸

سلام. این دو در موارد جزئی باهم تفاوت دارند و در بیشتر موارد میتونید از همون var استفاده کنید... let جدیدتر از var هست..

حسن فرجی جمعه ۱۱ مرداد ۱۳۹۸

سلام من دیدم که بعضی وقتی ها بعد case مقدار رو داخل کاراکتر ' ' گذاشتین مثل نمونه دومی و بعضی موقع ها نه چه مواقعی از این کاراکتر باید استفاده کنیم چه موقعی نباید استفاده کنیم؟

حمید رضا ملکی جمعه ۱۱ مرداد ۱۳۹۸

سلام. به نوع مقادیری که مقایسه میشوند دقت کنید. وقتی یک رشته مورد مقایسه قرار کرده باید از ' ' استفاده کنیم. وقتی عدد هست دیگه نیازی نیست. 

برای ارسال دیدگاه لازم است ابتدا وارد سایت شوید