if / else if / else で段階判定

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

このレッスンで分かること

  • if / else if / else で 3 つ以上の枝を上から順に判定できます
  • 最初に true になった枝だけが実行されます
  • 最小例は if (s >= 90) return 'A'; else if (s >= 80) return 'B'; ... else return 'F';

if / else if / else で段階判定 とは

点数を 5 段階の成績 A / B / C / D / F に分類する関数を else if で書く。

if / else if / else で段階判定

前のレッスンの js-if-basic では ifelse の 2 分岐を扱いました。実際のプログラムでは「合格 / 不合格」のような 2 択ではなく、段階的な判定 が必要なことが多いです。たとえば成績を A B C D F の 5 段階で出したい、温度を 寒い / 涼しい / 暑い の 3 段階で出したい、といったケースです。こうしたとき活躍するのが else if です。

「もし 90 点以上なら A、そうじゃなくて 80 点以上なら B、…」のように、上から順に条件を見て、最初にあてはまった枝だけが実行される仕組みになります。

else if の文法

基本形は次の通りです。

JavaScript

if (条件1) { // 条件1が true のときの処理 } else if (条件2) { // 条件1が false で条件2が true のときの処理 } else if (条件3) { // 条件1も条件2も false で条件3が true のときの処理 } else { // どれも false のときの処理 }

if は 1 つ、else if は何個でも、else は最後に 1 つだけ書けます。JavaScript は上から順に条件を評価して、最初に true になった枝 に入ったら、そこで分岐の評価は終わりです。

上から順に評価される、というのが大事です。順番を間違えると、後ろの条件にたどり着く前に手前の条件で捕まってしまいます。

動きを追ってみる

成績を A / B / C / D / F の 5 段階に分けるとします。90 以上は A80 以上は B70 以上は C60 以上は D、それ未満は F という基準です。素直に書くと次のようになります。

JavaScript

function gradeOf (score) { if (score >= 90) { return 'A'; } else if (score >= 80) { return 'B'; } else if (score >= 70) { return 'C'; } else if (score >= 60) { return 'D'; } else { return 'F'; } } gradeOf(95); // 'A' gradeOf(72); // 'C' gradeOf(40); // 'F'

return を含む if / else if / else は、書き方として非常によく使う形です。各 return で関数を抜けるので、else if (score < 80) のように下限の条件を書かなくても済むのがポイントです。

diagram (will load when visible)

図の判定順序を箇条書きで書き直すと、次の通りです。

  1. score >= 90 を評価する。真なら 'A' を返して終了
  2. score >= 80 を評価する。真なら 'B' を返して終了
  3. score >= 70 を評価する。真なら 'C' を返して終了
  4. score >= 60 を評価する。真なら 'D' を返して終了
  5. すべて偽なら 'F' を返して終了

入力と結果の対応表は次の通りです。

score結果
100'A'
90'A'
85'B'
72'C'
65'D'
40'F'

このように、if / else if は「ふるい」のように上から順に粗いふるいを通して、引っかかったら処理を確定させます。

別解 — 配列とループで書く

5 段階くらいまでなら else if の連鎖でも読みやすいですが、段階が増えると見通しが悪くなります。データだけ書き分ける別解もあります。

JavaScript

const thresholds = [ { min: 90, label: 'A' }, { min: 80, label: 'B' }, { min: 70, label: 'C' }, { min: 60, label: 'D' }, ]; function gradeOf2 (score) { for (const t of thresholds) { if (score >= t.min) return t.label; } return 'F'; }

このように「条件」と「結果」をデータに切り出すと、後から境界値を変更するのが楽になります。ただし最初は素直な else if で書いて、必要が出てきたらリファクタリングするので十分です。

よくある間違い

  1. 条件の順番を逆にする。if (score >= 60) return 'D'; else if (score >= 90) return 'A'; と書いてしまうと、100 点でも 'D' になります。高い条件から書く か、低い条件から書く か、方向を統一しましょう
  2. else を書き忘れる。最後の else がないと、どの条件にも当たらない値で undefined が返ってきます
  3. 範囲を 60 <= score <= 70 のように書く。JavaScript ではこの書き方は意図通りに動きません。score >= 60 && score < 70 のように && で結合します
この章のポイント

ここまでの要点 高い条件から書く。最後の else を必ず置く。範囲条件は && で結合し、a <= x <= b は使わない。

やってみよう

点数 score (0〜100 の整数) を受け取り、'A' 'B' 'C' 'D' 'F' のいずれかを返す関数 gradeOf を実装してください。境界は 90 以上 A80 以上 B70 以上 C60 以上 D、それ未満 F です。else if を使って 5 つの枝に分けましょう。

よくある質問

Q. ブラウザと Node.js で動作は変わりますか?

A. JavaScript の構文・組み込み機能(配列・文字列・Promise 等)はどちらでも同じです。違いは DOM API(ブラウザ専用)と fs などのファイル系(Node 専用)など、実行環境固有の機能です。コアロジックは両方で動くため、テストもしやすくなります。

Q. ES6 以降の新機能は使っても大丈夫ですか?

A. 現代のブラウザ・Node.js は ES2020 以降の機能をほぼサポートしています。古い IE 等を対象にする必要が無ければ、let/const、アロー関数、分割代入、async/await を積極的に使ってください。トランスパイル(Babel/Vite)が必要なケースは年々減っています。

Q. TypeScript に進む価値はありますか?

A. 型情報があるとリファクタやエディタ補完が劇的に効くため、規模が大きくなるなら TypeScript への移行を強くおすすめします。最初は any を許容しつつ徐々に型を付ければ、JS の知識をそのまま活かせます。

次のレッスン

次は switch 文で値を一覧から選ぶ で、点数を 5 段階の成績 A / B / C / D / F に分類する関数を else if で書く を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. if / else if / else の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. if / else if / else とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. if / else if / else を使って 5 段階に分岐すること
  2. 戻り値は 'A' 'B' 'C' 'D' 'F' のいずれかに限定すること
  3. 境界値 (90, 80, 70, 60) も上の段階に含めること

入出力例

test-cases.txt

gradeOf(95)"A" gradeOf(90)"A" gradeOf(85)"B" gradeOf(72)"C" gradeOf(60)"D" gradeOf(40)"F" gradeOf(0)"F"

ヒント

main.js
main.js
学習モード

メモ

if / else if / else で段階判定

⌘S で保存