switch と case のインデントレベル

主に2種類あると思う。

switch (expr) {
  case expr1:
    break;
  case expr2:
    break;
  default:
    // ...
}

switch (expr) {
case expr1:
  break;
case expr2:
  break;
default:
  // ...
}

ボクは、前者がお勧めだと思っている。jslint ? そんなの知りません。

  1. vim のデフォルトがインデントするから
  2. ブロック文を生成した時の整合性

1番目はいいや、単にボクの使用エディタがvimだってだけだから。

2番目。

switch内の最後の句で、微妙にインデントレベルが合わなくて気分が悪くなるわけだが、下記のようにブロック文にするとすっきりさせることができる。

switch (expr) {
  case expr1:
    break;
  case expr2:
    break;
  default: {
    // ...
  }
}

また、 将来的に、ECMAScript.next が主流になり──僕の場合はMozilla JSがメインなので主流なのだが──let,constが使えるようになると、case句内で使用したくなることがある。

んで、もし下記のように書くと、TypeError: redeclaration of variable foo(Mozilla JSの場合)というエラーが発生する。同一case句等ではブロックが発生しないため、同一ブロックないに同じ変数を宣言してしまうことになるからだ。

switch (expr) {
  case expr1:
    let foo = 20;
    // ...
    break;
  case expr2:
    let foo = 10;
    // ...
}
switch (expr) {
  case expr1: {
    let foo = 20;
    // ...
    break;
  }
  case expr2: {
    let foo = 10;
    // ...
    break;
  }
}

と、ブロックを生成すると良い。

これが、switchとcaseが同じインデントレベルだと、非常に気持ち悪いことになる。

switch (expr) {
case expr1: {
  let foo = 20;
  // ...
  break;
}
case expr2: {
  let foo = 10;
  // ...
  break;
}
}

ってことで、将来的なことも考えて、case,default句はインデントした方が良いと思う。