JavaScript - switch条件文

JavascriptのSwitch条件文について紹介します。 switchで実装できるものはすべてifステートメントで実装できますが、読みやすくするためにswitchを使用できます。

1. switch文法

switchの文法は、Javaなどの他の言語とSyntaxが似ています。

以下のようにswitchに渡されたexpressionとcaseの valueが一致すると、そのcaseのコードが実行されます。一致するものがない場合は、defaultのコードが実行されます。 もしbreakがなければ、その下のcaseもすべて実行されます。

const expression = value1;

switch (expression) {
  case value1:
    // do something
    break;
  case value2:
    // do something
    break;
  ...
  case valueN:
    // do something
    break;
  default:
    // do something
    break;
}

2. switchの例

以下はswitchを使用した例です。

以下の例では

  • Orangeをswitchに渡すと case Orange``が実行され、ブレークが呼び出され、switch構文が終了します
  • Appleをswitchに渡すとcase Appleが行われ、breakがないので case `Mango``の構文まで実行し、breakに会ってswitchを終了します
  • Bananaをswitchに渡すと、一致するケースがないため、 default構文が実行されます
function buySomething(expr) {
  switch (expr) {
    case 'Orange':
      console.log('You can buy orange');
      break;
    case 'Apple':
    case 'Mango':
      console.log('You can buy apple or mango');
      break;
    default:
      console.log(`Sorry, we are out of ${expr}.`);
  }
}

buySomething("Orange");
buySomething("Apple");
buySomething("Mango");
buySomething("Banana");

Output:

You can buy orange
You can buy apple or mango
You can buy apple or mango
Sorry, we are out of Banana.

3. Numberを使用したswitchの例

String だけでなく、次のように Number 型のオブジェクトも switch で使用できます。

function doSomething(expr) {
  switch (expr) {
    case -1:
      console.log(-1);
      break;
    case 0:
      console.log(0);
      break;
    case 1:
      console.log(1);
      break;
    default:
      console.log("default");
  }
}

doSomething(-1);
doSomething(-0);
doSomething(1);
doSomething(-2);

Output:

-1
0
1
default

4. switch内で変数を宣言して使用する

switch 構文内で変数を宣言して使用できます。

しかし、以下のように同じ名前の変数をcaseごとに宣言すると、同じ変数が宣言されたとコンパイルエラーが発生します。

let expr = "hi";

switch (expr) {
  case "hi":
    let msg = "hi!";
    console.log(msg);
    break;
  case "hello":
    let msg = "hello!";
    console.log(msg);
    break;
}

Output:

let msg = "hello!";
    ^
SyntaxError: Identifier 'msg' has already been declared
at wrapSafe (internal/modules/cjs/loader.js:1001:16)

こういうときは、次のように { } で case 構文をラップして scope を分離すれば同じ名前の変数を case ごとに使用できます。

let expr = "hi";

switch (expr) {
  case "hi": {
    let msg = "hi!";
    console.log(msg);
    break;
  }
  case "hello": {
    let msg = "hello!";
    console.log(msg);
    break;
  }
}

Output:

hi!
codechachaCopyright ©2019 codechacha