お友達のWEBデザイナーが switch文の使いどころが??みたいな話をしてました。

私は、職業プログラミングをPerlからはじめたのですが、Perlにはswitchがない。その影響からか他の言語を書くときもめったにswitchは使いません。要するに使わなくても困りません!これ結論。(笑

まぁそれじゃだめなので、色々例示してみましょう。

意味としてはelse ifの構文とほとんど一緒ではあるのですが。。。。以下JSで書きます。


まず、基本。

例1:

var i = 1;
if( i == 0 ){
document.write( '0だよ!' );
}
else if( i == 1 ){
document.write( '1だよ!' );
}
else if( i == 2 ){
document.write( '2だよ!' );
}
else{
document.write( '0から2以外だよ!' );
}

例2:

var i = 1;
switch( i ){

case 0 :
document.write( '0だよ!' );
break;

case 1 :
document.write( '1だよ!' );
break;

case 2 :
document.write( '2だよ!' );
break;

default :
document.write( '0から2以外だよ!' );

}

例2は例1をswitch文で書き換えたものです。

結果はどちらも「1だよ!」と表示されます。

switchは基本的には、判定する変数がひとつの複数条件分岐に使います。


switch文につき物の「break;」。

「break」はブロックを抜けろという意味の命令文。ブロックとはものすごくざっくり言うと「{」と「}」に囲まれた部分。switch構文の中に書けば、switch構文のところを抜けろという意味になります。

これを踏まえて、以下を。

例3:

var i = 1;
switch( i ){

case 0 :
document.write( '0だよ!' );

case 1 :
document.write( '1だよ!' );

case 2 :
document.write( '2だよ!' );

default :
document.write( '0から2以外だよ!' );

}

例3は例2から「break;」を取り払った内容です。

これを実行すると結果出力は「1だよ2だよ0から2以外だよ!」になるはずです。

ここがswitch文の特徴のひとつです。
else if構文では、条件にあったところだけを実行して、その後のブロックは無視されます。
switch構文では、条件にあったところ以降(breakが出てくるまで)すべてのステートメントを実行してしまいます。


例3を踏まえて、以下を。

例4:

var i = 1;
switch( i ){

case 0 :
case 1 :
document.write( '0か1だよ!' );
break;

case 2 :
document.write( '2だよ!' );
break;

default :
document.write( '0から2以外だよ!' );

}

この場合、結果は「0か1だよ!」になるはず。まぁ当たり前。で「var i = 1;」を「var i = 0;」にしても結果は同じく「0か1だよ!」になります。
switch構文は、条件に合致したところ以下、break;が出てくるまで実行し続けます。
上記の例なら、「iが0だったとき」にbreakが用意されていないので、その下の「iが1だったとき」のステートメントが実行され、その中にbreakがあるので、そこでswitch文を抜けます。

つまり意味としては
「iが0だったとき」または「iが1だったとき」
という意味になるんですね。

例5

var i = 0;
if( (i == 0) || (i == 1) ){
document.write( '0か1だよ!' );
}
else if( i == 2 ){
document.write( '2だよ!' );
}
else{
document.write( '0から2以外だよ!' );
}

例4をif/else if構文で書き換えるとこんな感じ。「または」の意味を「||」でつないでいるのが分かります。例5の場合、「または」の条件が2つなのでまだマシですけど、これが3つ4つになると鬱陶しいですよね?

要するに可読性が上がるというわけですな。(案外これ重要)
どこのサイトか忘れましたけど、JSでswitch使ったときと、else ifを使ったときでどっちが早いかということを実験してたところがありました。switch構文を使ったほうが早いということだったのは覚えています。



ちなみに!逆転の発想でこんなこともできたり・・・。

var array = new Array();
array[0] = false;
array[1] = false;
array[2] = true;
array[3] = false;
array[4] = false;

switch( true ){

case array[0]:
document.write( '0がTRUE!' );
break;

case array[1]:
document.write( '1がTRUE!' );
break;

case array[2]:
document.write( '2がTRUE!' );
break;

case array[3]:
document.write( '3がTRUE!' );
break;

case array[4]:
document.write( '4がTRUE!' );
break;

default:
document.write( 'どれもTRUEじゃなかった(T_T)' );
}

条件にtrueを渡しておいて、caseに出てくる変数のどれがtrueかを判定する。
上記例の場合は、true|falseですが、数値とか文字列もいけるはず。

多少パフォーマンスを犠牲にしてますが、可読性はあがるのでは。と。。。



まとめ!

あまり使いどころの説明にはならなかったなこの記事・・・。反省。