●switch文とは
プログラミングを学び始めたばかりのエンジニアの皆さん、こんにちは。
今回は、JavaScriptのswitch文について解説していきます。
あなたは、if文を使って条件分岐を行ったことがあるでしょう。
でも、条件が多くなってくると、if文だけでは読みにくいコードになってしまいます。
そんな時に活躍するのが、switch文です。
switch文は、ある変数の値に応じて、複数の処理を分岐させるための構文です。
if文と同じように条件分岐を行いますが、より簡潔に書くことができます。
これから、switch文の基本的な使い方から、応用的な使い方まで、一緒に学んでいきましょう。
○switch文の基本的な構文
まずは、switch文の基本的な構文から見ていきましょう。
switch文は、switch
キーワードに続けて、丸括弧()
で囲まれた式を指定します。
この式の結果によって、どの処理を実行するかが決まります。
次に、case
キーワードを使って、式の結果と比較する値を指定します。
式の結果が、case
に指定した値と等しい場合、そのcaseブロック内の処理が実行されます。
各caseブロックの最後には、break
文を記述します。
これは、そのcaseブロックの処理が終わったら、switch文全体を抜け出すためのものです。
break
文がない場合、次のcaseブロックの処理も実行されてしまいます。
最後に、default
キーワードを使って、式の結果がどのcaseとも一致しなかった場合の処理を記述します。default
ブロックは省略可能です。
○サンプルコード1:switch文の基本例
では、実際にswitch文を使ってみましょう。
次のコードは、曜日を表す数値によって、その日の予定を出力するプログラムです。
実行結果
この例では、変数day
に3が代入されているので、case 3
のブロックが実行され、”水曜日は定例ミーティングの日です”と出力されます。
●switch文を使った変数への値の代入
前回は、switch文の基本的な使い方について解説してきました。
今回は、switch文を使って変数に値を代入する方法について解説していきます。
switch文は、条件に応じて処理を分岐させるだけでなく、変数に値を代入することもできます。
これを使いこなせば、コードの可読性が上がり、より効率的なプログラミングができるようになります。
○サンプルコード2:switch文で変数に値を代入する例
それでは、実際にswitch文を使って変数に値を代入してみましょう。
次のコードは、ユーザーの選択に応じて、変数message
に異なるメッセージを代入するプログラムです。
実行結果
この例では、userChoice
の値に応じて、message
変数に異なる文字列を代入しています。
userChoice
が1の場合は”あなたは優秀な人材です”、2の場合は”あなたはまだ成長の余地があります”、3の場合は”あなたには向いていない仕事かもしれません”が代入されます。
いずれのcaseにも当てはまらない場合は、default
ブロックが実行され、”選択肢が正しくありません”が代入されます。
このように、switch文を使えば、条件に応じて変数に異なる値を代入できます。
if文を使っても同じことができますが、条件が多い場合はswitch文の方が読みやすいコードになります。
○サンプルコード3:breakを使わない場合
ところで、先ほどのコードでは各caseブロックの最後にbreak
文を使っていましたが、これを省略するとどうなるでしょうか。
次のコードを見てみましょう。
実行結果
userChoice
が1なのに、出力されるのは”選択肢が正しくありません”です。
これは、break
文がないために、一致したcaseブロックの処理が終わっても、そのまま次のcaseブロックの処理が実行されてしまうためです。
このような動作を「フォールスルー」と呼びます。
フォールスルーを意図的に使うこともありますが、意図しない場合はバグの原因になります。
基本的には、各caseブロックの最後にbreak
文を書くようにしましょう。
○サンプルコード4:defaultを使う場合
次は、default
ブロックについて詳しく見ていきましょう。
次のコードは、ユーザーの年齢に応じて、変数category
に異なる文字列を代入するプログラムです。
実行結果
この例では、switch
文の引数にtrue
を指定しています。
これにより、各caseブロックの条件式が評価され、最初にtrue
になったcaseブロックが実行されます。
age
が25なので、case age >= 20
のブロックが実行され、category
変数に”大人”が代入されます。
ここで注目したいのは、default
ブロックの位置です。
default
ブロックは、どのcaseブロックにも当てはまらない場合に実行されます。
この例では、age
が負の値の場合に”不正な値”が代入されます。
default
ブロックは省略可能ですが、予期しない値が渡された場合のエラー処理として書いておくと安全です。
○サンプルコード5:式による条件分岐
最後に、switch文の条件に式を使う方法を見ていきましょう。
次のコードは、ユーザーの入力に応じて、変数result
に異なる計算結果を代入するプログラムです。
実行結果
この例では、operator
変数に格納された演算子に応じて、result
変数に計算結果を代入しています。
operator
が”+”なので、case "+":
のブロックが実行され、num1
とnum2
の和がresult
に代入されます。
このように、switch文の条件には式を使うこともできます。
式の結果が、caseブロックの値と一致すれば、そのブロックが実行されるという仕組みです。
●switch文のネスト
ここまでは、単一のswitch文を使った条件分岐について見てきました。
ただ、実際の開発現場では、もっと複雑な条件分岐を行う必要がある場面があります。
そんな時に役立つのが、switch文のネストです。ネストとは、switch文の中にさらにswitch文を入れ子にすることを指します。
これで、より細かい条件分岐を行うことができるようになります。
○サンプルコード6:switch文のネスト例
それでは、実際にswitch文のネストを使ったコードを見ていきましょう。
次のコードは、ユーザーの年齢と性別に応じて、変数message
に異なるメッセージを代入するプログラムです。
実行結果
まず、外側のswitch文でage
の値に応じて大まかな年齢区分(成人or未成年)を判定しています。
そして、内側のswitch文でgender
の値に応じて、性別を判定しています。
age
が25、gender
が”男性”なので、最初にcase age >= 20:
のブロックが実行され、続いて内側のcase "男性":
のブロックが実行されます。
その結果、message
変数に”あなたは成人男性です”が代入され、出力されます。
●switch文とif文の使い分け
ここまでswitch文について詳しく学んできたみなさんも、こんな疑問を持ったのではないでしょうか。
「そもそもswitch文とif文って、どう使い分ければいいの?」と。
実は、switch文とif文は、どちらも条件分岐を行うための構文なんです。
つまり、ある条件に応じて処理を切り替えるという点では、同じ役割を持っています。
でも、それぞれの特徴を理解して、状況に応じて適切に使い分けることが大切なんですよ。
まず、if文は条件式の真偽(true/false)によって処理を分岐させます。
条件式は自由に設定できるので、柔軟性が高いのが特徴です。一方、switch文は式の値に応じて処理を分岐させます。
式の結果と一致するcaseブロックの処理が実行されるので、多岐にわたる条件分岐を簡潔に書くことができます。
では、具体的なコード例を見ながら、switch文とif文の使い分け方を考えていきましょう。
○サンプルコード7:if文で書いた例
まずは、if文を使って曜日に応じて処理を分岐させる例を見てみましょう。
実行結果
この例では、day
変数の値が平日(月曜日〜金曜日)か休日(土曜日〜日曜日)かによって、message
変数に代入する文字列を切り替えています。
if文の条件式で、||
(論理和)演算子を使って複数の条件をつなげているのがポイントです。
○サンプルコード8:switch文で書いた例
続いて、同じ処理をswitch文で書き換えてみましょう。
実行結果
switch文を使うと、day
変数の値に応じて処理を分岐させることができます。
平日の場合は、case "月曜日":
からcase "金曜日":
までの連続したcaseブロックが実行され、message
変数に”平日です。仕事頑張りましょう!”が代入されます。
休日の場合は、case "土曜日":
とcase "日曜日":
のブロックが実行され、”休日です。ゆっくり休みましょう!”が代入されます。
if文で書いた場合と比べると、switch文の方がシンプルで読みやすいコードになっているのがわかりますね。
特に、同じ処理を行う条件が連続する場合は、switch文の方が効率的に書けます。
ただし、if文のように複雑な条件式を使った分岐は、switch文では表現しづらいので注意が必要です。
条件式の自由度が高い場合は、if文を使う方が適しているでしょう。
●switch文を使う際の注意点
switch文についてかなり理解が深まってきたのではないでしょうか。
でも、知っておくべき注意点もまだまだあるんです。
最後に、switch文を使う際の注意点について詳しく見ていきましょう。
○フォールスルー
まず注意したいのが、「フォールスルー」という動作です。
これは、先ほどのサンプルコードでも少し触れましたが、ある条件に一致した後、break
文がない場合に起こります。
フォールスルーが起こると、一致したcaseブロックの処理が終わった後も、次のcaseブロックの処理が続けて実行されてしまうんです。
意図しない動作につながる可能性があるので、注意が必要ですよ。
実際に、フォールスルーが起こるコードを見てみましょう。
実行結果
num
は1なので、case 1:
のブロックが実行されるはずですが、break
文がないため、フォールスルーが起こっています。
その結果、case 2:
、case 3:
、default:
のブロックも順番に実行され、最終的にresult
には”その他”が代入されてしまうんです。
このように、意図しないフォールスルーが起こると、プログラムの動作が予期せぬものになってしまいます。
switch文を使う際は、各caseブロックの最後にbreak
文を書くことを習慣づけましょう。
○文字列と数値の比較
もう一つの注意点は、switch文の条件式で文字列と数値を比較する場合の動作です。
これは、JavaScriptの性質に由来するものなんですが、ちょっとわかりにくいかもしれません。
具体的に見ていきましょう。
次のコードは、num
の値に応じてresult
に文字列を代入するものです。
実行結果
num
は文字列の”1″なので、case "1":
のブロックが実行され、”文字列の1″が出力されますね。
でも、case 1:
のブロックは実行されないのでしょうか?
実は、JavaScriptでは、switch文の条件式の比較に「等価演算子(==)」が使われるんです。
これは、比較する値の型が異なる場合に、暗黙的な型変換を行ってから比較します。
つまり、case 1:
の比較では、文字列の”1″が数値の1に変換されてから比較されるんですね。
その結果、case 1:
の条件にも一致することになります。
ただし、このような暗黙的な型変換は、コードの可読性を下げる原因になります。
switch文の条件式では、比較する値の型を揃えることをおすすめします。
数値を比較するならnum
も数値に、文字列を比較するならnum
も文字列にしておくのが良いでしょう。
まとめ
さて、JavaScriptのswitch文について、一通り学んできましたね。
基本的な使い方から、変数への値の代入、switch文のネスト、if文との使い分け、そして注意点まで、たくさんのことを見てきました。
switch文を使いこなせるようになれば、より効率的で可読性の高いコードが書けるようになるはずです。
それは、あなたのエンジニアとしての成長につながります。
長い記事を最後まで読んでいただき、ありがとうございました。
ここで学んだことを、ぜひ実際のコーディングで活かしてみてください。
あなたのJavaScriptプログラミングが、より充実したものになりますように。