1. 0 時はこんばんは
  2. 境界の 5 時からおはようございます
  3. 境界の 12 時からこんにちは
  4. 境界の 18 時からこんばんは
  5. 23 時もこんばんは
コース一覧
JavaScript基礎文法:処理を組み立てる
つくる 時間帯で挨拶を変える

JavaScript基礎文法:処理を組み立てる

if・switch による条件分岐、配列とループ、関数とコールバック、オブジェクトを順に組み立てる全 33 レッスン(525 分)の基礎文法コースです。FizzBuzz、作品リスト、関数への整理、作品データの構造化を通して、入力から結果を返す処理を自分で分解して書きます。DOM 操作は次のコースで扱います。

1
条件分岐
01. if 文の基本15分
02. if / else if / else で段階判定15分
03. switch 文で値を一覧から選ぶ15分
04. 条件を組み合わせる20分
05. FizzBuzz で複数条件を組み立てる20分
06. つくる 時間帯で挨拶を変える20分
07. 第1章まとめクイズ10分
2
配列とループ
01. 配列のきほん15分
02. 要素を足す・取り除く15分
03. for ループで合計を求める15分
04. for-of で配列を走査する15分
05. while で条件を満たす間くり返す15分
06. break と continue でループを制御する15分
07. つくる 作品リストを一覧にする20分
08. 第2章まとめクイズ10分
3
関数
01. 関数宣言15分
02. アロー関数15分
03. デフォルト引数15分
04. 早期 return でネストを浅くする15分
05. 変数のスコープ15分
06. コールバック関数15分
07. forEach で配列をまわす15分
08. つくる 処理を関数に整理する20分
09. 第3章まとめクイズ10分
4
オブジェクト
01. オブジェクトのきほん18分
02. オブジェクトで複数の値を返す16分
03. const と参照18分
04. ?. で安全に取り出す16分
05. 分割代入18分
06. スプレッド構文18分
07. find と includes で探す16分
08. つくる 作品データを構造化する25分
09. 第4章まとめクイズ10分

つくる 時間帯で挨拶を変える

解説

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

  • 両端のある範囲は、2 つの比較を && でつないで書きます
  • 飛び飛びの範囲は、拾いたい帯だけ条件で拾い、残りを else で受けます
  • 範囲の判定は、境目の前後だけ確かめれば足ります

60 以上 80 未満を、1 つの比較では書けない

範囲で分ける判定を書くとき、多くの人がまず数学の書き方を試します。

JavaScript

// NG。60 <= score の結果 (true か false) と 80 を比較してしまう if (60 <= score < 80) { }

構文エラーにならず、そのまま動いてしまうのが厄介です。まず 60 <= score が評価されて true か false になり、その真偽値と 80 が比べられます。真偽値は数として 1 か 0 に変換されるので、この条件はどんな値でも成立します。

両端のある範囲は、2 つの比較を && でつなぎます。

JavaScript

// OK if (score >= 60 && score < 80) { }

前のレッスンで「else if なら上限は書かなくてよい」と学びましたが、下限は事情が違います。score >= 60 を省くと、1 つ目の条件が false になるような小さい値まで拾ってしまいます。省いてよいのは、前の条件から論理的に導けるものだけです。

拾いたい帯だけ拾って、残りを else に落とす

範囲が飛び飛びになることがあります。時計のように 0 で 1 周する数を扱うと、同じ扱いにしたい帯が円環の切れ目をまたいで 2 か所に分かれます。else if は上から順に評価する構造なので、離れた 2 つの範囲はそのままでは書きにくいのです。

そこで発想を変えます。拾いたい帯だけを条件で拾い、残りを全部 else で受け止めるのです。こうすれば離れた範囲が 1 か所にまとまり、枝の数が減ります。仕様の表が 5 行あっても、コードの枝は 3 つで足りることがあります。書き始める前に、表を「どの順で拾うか」の形に組み替えてみてください。

解説

実際のサイトでは現在時刻を new Date().getHours() で取れます。ですが現在時刻に依存する関数はテストしづらいので、値は引数で受け取る形にします。「値を決める処理」と「値から答えを決める処理」を分けておくのは、実務でもよく使う設計です。

真ん中を 10 個試すより、境目を 4 つ

範囲の判定は、境目の前後だけ確かめれば足ります。下限、下限の 1 つ手前、上限、上限の 1 つ先。この 4 点が合っていれば、範囲の中身は自動的に正しくなります。

値通ってほしい枝
591 つ手前の枝
60この枝 (下限)
79この枝 (上限)
80次の枝

加えて、扱う値の下端と上端も 1 度ずつ流してください。どんな値もどれか 1 つの枝に必ず入ることを、自分の目で確かめておきます。

よくある間違い

  • 上限と下限を両方 <= にする — 境目の値が 2 つの枝の両方に当てはまってしまいます

JavaScript

// NG。80 がどちらの枝にも当てはまる if (score >= 60 && score <= 80) { } else if (score >= 80 && score <= 100) { }

else if なら先に書いたほうが勝つので答えは出ますが、仕様の表と食い違ったまま気付けません。上限は <、下限は >= のように、片方だけが含む形にそろえてください。

  • 最後を else if で終える — どの枝にも入らない値が出て undefined が返ります。最後は条件を書かない else で受け止めてください

要件

  1. 関数名は greetByHour、引数は 0 から 23 の整数 hour の 1 つ
  2. 5 以上 12 未満なら "おはようございます"、12 以上 18 未満なら "こんにちは" を返す
  3. それ以外の時刻はすべて else で受け止め、"こんばんは" を返す
  4. 範囲の判定は && で 2 つの比較をつなぎ、戻り値はすべて文字列にする

入出力例

greetByHour(0) → "こんばんは" greetByHour(5) → "おはようございます" greetByHour(12) → "こんにちは" greetByHour(18) → "こんばんは" greetByHour(23) → "こんばんは"

ヒント

先に範囲の表を作り、朝と昼だけを条件で拾って残りを else に落とす形を考えます

上下の両端がある範囲は hour >= 5 && hour < 12 のように && でつなぎます

境目の 4 と 5、11 と 12、17 と 18 を手で流して、そこで答えが切り替わるか確かめてください

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/05·更新 2026/08/26

関連レッスン

  • 第1章まとめクイズ

    第4章で学んだ if / else if / else、switch、論理演算子による条件の組み立てを 5 問で確認します。判定の順番と境界値の扱いが中心です。

  • 配列のきほん

    複数の値をひとつの変数にまとめて持つための入れ物が配列です。作成のしかたと、番号を使った要素の取り出しかたを覚えます。

  • 関数宣言

    function キーワードで処理に名前を付け、引数を受け取って戻り値を返す仕組みを学びます。プロフィールサイトの挨拶づくりを関数にまとめます。

  • オブジェクトのきほん

    関連する値をひとつの箱にまとめる入れ物がオブジェクトです。作成とプロパティの読み書きを身に付けます。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 評価出力品質を数値化して継続改善する活動
  • 関数処理に名前を付けて再利用できる単位
  • テストバグを見つける工程
  • 引数位置引数=順番で渡す。
  • 処理計算や代入を表す長方形
  • 設計何をどう作るかを決める前工程
  • 戻り値呼び出し元への返答を表す点線矢印
main.js
学習モード
エディタを読み込んでいます

メモ

つくる 時間帯で挨拶を変える

⌘S で保存