مقدمه

در برنامه‌های جاوااسکریپت، گزاره‌ها (statements) به همان ترتیبی که نوشته شده‌اند، یعنی از بالا به پایین، اجرا می‌شوند. اما برنامه‌نویسی همیشه یک جاده‌ی مستقیم نیست. گاهی اوقات لازم است که اجرای از بالا به پایین کدها، جای خود را به اجرای شرطی (conditional execution) بدهد. این یعنی اینکه اجرا یا عدم اجرای یک مجموعه از دستورات به برقرار بودن یا نبودن یک شرط مشخص وابسته شود. در جاوااسکریپت، برای پیاده‌سازی سناریوهایی که به اجرای شرطی نیاز دارند، ساختارهای if و switch تدارک دیده شده‌اند. یک عملگر شرطی هم داریم که دارای نماد ? است و در برخی موارد، استفاده از آن به‌صرفه‌تر است.

گزاره if

گزاره‌ی if شرطی را بررسی می‌کند و اگر آن شرط برقرار باشد، یعنی با true ارزیابی شود، یک مجموعه از دستورات را اجرا می‌کند. ساختار کلی یک گزاره‌ی if به صورت زیر است.

if (condition) {
  // statements
}

ابتدا کلمه‌ کلیدی if به همراه یک جفت پرانتز نوشته شده و سپس، عبارت شرطی مورد نظر که در اینجا condition نامیده شده درون پرانتزها قرار می‌گیرد. سپس، یک جفت آکلاد به عنوان بلاک if ایجاد شده و دستوراتی که مایلیم در صورت برقرار بودن شرط اجرا شوند، در این بلاک قرار داده می‌شود. عبارت شرط که در اینجا condition نام دارد، می‌تواند یک عبارت بولین یا غیر بولین باشد.

  • اگر condition یک عبارت بولین باشد، دستورات بلاک if در صورت true بودن مقدار condition اجرا می‌شوند.
  • اگر condition یک عبارت غیر بولین باشد، به طور ضمنی به بولین تبدیل می‌شود و در صورت true بودن، دستورات بلاک if اجرا می‌شوند.

به عبارت دیگر، می‌توان گفت که بلاک if در صورتی اجرا می‌شود که عبارت شرطی یک مقدار truthy باشد. یادآوری می‌کنم که مقدار یا عبارتی که در صورت تبدیل به بولین، با مقدار true ارزیابی شود یک truthy است و عبارت یا مقداری که در صورت تبدیل به بولین، با false ارزیابی شود، یک falsy نام دارد. حالا مثال زیر را ببینید.

Copy Icon branching.js
let x = 10; 
let y = 15;
let z = 0;
            
if (x < y) {
  console.log("x is smaller than y");
}
            
if (x == y) {
  console.log("x is equalt to y");
}
            
if (x) {
  console.log("x is non-zero");
}
            
if (z) {
  console.log("z is non-zero");
}

در اینجا چهار گزاره‌ی if داریم که از بین آنها، شرط گزاره‌ی اول و سوم برقرار است و بنابراین، خروجی زیر را خواهیم داشت.

x is smaller than y
x is non-zero
          

بخش else

یک گزاره‌ی if می‌تواند شامل یک بخش else هم باشد. ساختار کلی یک گزاره‌ی if...else به صورت زیر است.

if (condition) {
  // code to run if condition is truthy
} else {
  // code to run if condition is falsy
}

به این ترتیب، اگر عبارت condition با یک مقدار truthy ارزیابی شود، دستورات بلاک if و در غیر این صورت، دستورات بلاک else اجرا خواهند شد. مثال زیر را ببینید.

Copy Icon branching.js
let x = 15;

if (x % 2 == 0) {
  console.log("x is even.");
} else {
  console.log("x is odd.");
}

در این مثال، شرط if برقرار نیست و بنابراین، خروجی زیر تولید خواهد شد.

x is odd.

بررسی چندین شرط با else if

گاهی اوقات باید چند شرط مورد بررسی قرار بگیرند. در این موارد، می‌توانیم از else if استفاده کنیم. مثال زیر، نحوه‌ی انجام این کار را نشان می‌دهد.

Copy Icon branching.js
let output;
let x = -3;
            
if (x > 0) {
  output = "positive";
} else if (x < 0) {
  output = "negative";
} else {
  output = "zero";
}
            
console.log(output); // negative

گزاره switch

ساختار شرطی دیگر در جاوااسکریپت گزاره‌های switch هستند که برخی مواقع استفاده از آنها نسبت به دستورات if…else تودرتو شده، به‌صرفه‌تر است. در حقیقت، دستورات if…else برای مواقعی که عبارت شرطی پیچیده بوده و مثلاً‌ شامل چندین عملگر منطقی باشد و هر حالت شامل مقدار قابل توجهی کد برای اجرا باشد، مناسب هستند. اما اگر عبارت شرطی که باید بررسی و ارزیابی شود ساده باشد و تنها کاری که می‌خواهیم بسته به وضعیت آن شرط انجام دهیم این است که مقداری را به یک متغیر اختصاص دهیم و یا چیزی را در خروجی چاپ کنیم، بهتر است از switch استفاده کنیم. ساختار کلی یک گزاره‌ی switch به صورت زیر است.

switch (expression) {
  case choice1:
      // run this code
      break;
          
  case choice2:
      // run this code instead
      break;
          
  // include as many cases as you like
          
  default:
  // otherwise, just run this code
}

مثال زیر نحوه‌ی استفاده از این گزاره را در عمل نشان می‌دهد.

Copy Icon branching.js
let dayOfWeek = 2;

switch (dayOfWeek) {
  case 1:
    console.log("Monday");
    break;
  case 2:
    console.log("Tuesday");
    break;
  case 3:
    console.log("Wednesday");
    break;
  case 4:
    console.log("Thursday");
    break;
  case 5:
    console.log("Friday");
    break;
  case 6:
    console.log("Saturday");
    break;
  case 7:
    console.log("Sunday");
    break;
            
  default:
    console.log("something is wrong!");
}

در اینجا اصطلاحاً‌ روی متغیر dayOfWeek سوئیچ شده تا بسته به مقدار این متغیر، متنی در خروجی چاپ شود. در مقابل هر عبارت case مقداری نوشته شده که اگر این مقدار برابر با مقدار متغیر dayOfWeek باشد، دستور مربوط به این عبارت case اجرا می‌شود. اگر مقدار این متغیر با هیچ‌کدام از عبارات case مطابقت نداشته باشد، دستور مربوط به عبارت default اجرا خواهد شد. در مثال بالا ما مقدار 2 را برای متغیر dayOfWeek تعیین کرده‌ایم و بنابراین، دستور مربوط به case 2 اجرا می‌شود. به طور کلی، اگر این متغیر مقداری بین 1 تا 7 داشته باشد، نام روزی از هفته که متناظر با آن مقدار است، چاپ می‌شود و در غیر این صورت، پیغامی چاپ می‌شود مبنی بر اینکه اشتباهی رخ داده است. توجه داشته باشید که استفاده از default در یک گزاره‌ی switch اختیاری است. مقادیر مختلف را برای متغیر dayOWeek آزمایش کنید و نتیجه را ببینید.

عملگر شرطی ?

گاهی اوقات، می‌خواهیم بسته به نتیجه‌ی یک شرط، مقداری را به یک متغیر اختصاص دهیم. برای مثال:

Copy Icon branching.js
let x = 8; 
let result; 
            
if (x % 2 == 0) {
  result = "even";
} else {
  result = "odd";
}

این قبیل کارها را می‌توانیم با استفاده از یک عملگر شرطی به نام question mark که دارای نماد ? است، به شکل مختصرتر و ساده‌تری انجام دهیم. عملگر question mark تنها عملگر جاوااسکریپت است که دارای 3 عملوند است و از این‌رو عملگر ternary هم گفته می‌شود. سینتکس کلی این عملگر به صورت زیر است.

let result = condition ? value1 : value2;

اگر condition یک مقدار truthy باشد، مقدار value1 و در غیر این صورت، مقدار value2 برگردانده می‌شود. پس، مثال بالا را می‌توانیم با استفاده از عملگر ternary به صورت زیر بنویسیم.

Copy Icon branching.js
let x = 8; 
            
let result = (x % 2 == 0) ? "even": "odd";

نتیجه‌ی این کد، مثل کد قبلی، این است که مقدار رشته‌ای even در متغیر result ذخیره می‌شود.