一覧へ

三項演算子 — 条件を1行で表現

JavaScriptの三項演算子の原理、使い方、そして乱用してはいけない理由までをまとめます。

入門
|
7
|
検証済み (2026-07)
三項演算子ternary条件付きレンダリングJSX条件式
進捗0/55 (0%)

三項演算子 — 条件を一行で

このトピックを修了すると

三項演算子の構造を理解し、if/elseを一行に置き換えられるようになり、どのような状況で三項演算子が適切で、どのような状況で読みにくくなるかを判断できるようになります。


4行のif文を1行に

「成人の場合は入場、それ以外は入場不可」のような単純な分岐をif/elseで記述すると、次のようになります。

javascript
let message;
if (age >= 18) {
  message = "入場可能";
} else {
  message = "未成年者のアクセスは不可";
}

三項演算子を使うと、一行で記述できます。

javascript
const message = age >= 18 ? "入場可能" : "未成年者のアクセスは不可";

構造:条件 ? 真の場合の値 : 偽の場合の値

重要な点は、三項演算子は値を返すということです。ifは文(ステートメント)であり、値を返しませんが、三項演算子は式(エク​​スプレッション)であり、変数に直接格納できます。


基本的なパターン

javascript
// パターン1:変数の代入
const status = score >= 60 ? "合格" : "不合格";

// パターン2:関数の引数
console.log(isLoggedIn ? "ようこそ" : "ログインしてください");

// パターン3:テンプレートリテラルの内部
const greeting = `${hour < 12 ? "午前" : "午後"} ${hour % 12}時です`;

共通点:「2つの値のいずれかを選択する必要がある」状況で、その選択自体が一行で完結する場合、三項演算子が自然です。


React/JSXにおける三項演算子

Reactでは、三項演算子はほぼ必須です。JSX内ではif文を使用できないためです。

jsx
function UserGreeting({ isLoggedIn, name }) {
  return (
    <div>
      {isLoggedIn ? (
        <h1>{name}さん、ようこそ</h1>
      ) : (
        <button>ログイン</button>
      )}
    </div>
  );
}

JSXの波括弧 {} 内には、**式(エク​​スプレッション)**のみを記述できます。if/elseは文(ステートメント)であるため、記述できません。三項演算子は、インラインでの条件分岐を行うための唯一の手段です。


入れ子になった三項演算子 — 誘惑と落とし穴

2回以上分岐する場合、三項演算子を入れ子にしたいという誘惑が生じます。

javascript
// ❌ 読みにくい
const label = score >= 90 ? "A" : score >= 80 ? "B" : score >= 70 ? "C" : "F";

このコードは動作しますが、6か月後に読んでも解釈に時間がかかります。入れ子になった三項演算子は、インデントを付けても可読性が悪くなります。

代替案1 — if/else:

javascript
// ✅ 明確
let label;
if (score >= 90) label = "A";
else if (score >= 80) label = "B";
else if (score >= 70) label = "C";
else label = "F";

代替案2 — オブジェクトのマッピングまたは関数抽出:

javascript
function getGrade(score) {
  if (score >= 90) return "A";
  if (score >= 80) return "B";
  if (score >= 70) return "C";
  return "F";
}
const label = getGrade(score);

三項演算子 vs &&(論理AND)

Reactで、「条件が真の場合はレンダリングし、偽の場合は何もレンダリングしない」という場合:

jsx
// 三項演算子 — nullを明示的に返す
{isAdmin ? <AdminPanel /> : null}

// &&演算子 — より簡潔
{isAdmin && <AdminPanel />}

&& は、偽の場合にレンダリングするものが何もない場合に、三項演算子よりも簡潔です。ただし、注意点があります。

jsx
// ⚠️ 危険:countが0の場合、画面に "0" がレンダリングされる
{count && <ItemList />}

// ✅ 安全:明示的にブール値に変換
{count > 0 && <ItemList />}

0 はfalsyですが、Reactは数値 0 を画面にレンダリングします。&& の左側が数値の場合、比較演算子を使用してブール値にする必要があります。


Nullish Coalescing (??) との違い

javascript
// 三項演算子:条件に応じて2つの値のいずれかを選択
const display = value !== null ? value : "デフォルト値";

// ??:nullまたはundefinedの場合のみ置換
const display = value ?? "デフォルト値";

?? は、nullundefined のみをフィルタリングします。0""false などのfalsy値はそのまま通過させます。三項演算子は、どのような条件でも使用できるため、汎用的であり、?? は「値がない場合にデフォルト値」という狭い用途に特化しています。


判断基準

状況推奨
2つの値のいずれかを選択して代入✅ 三項演算子
JSXインライン条件付きレンダリング✅ 三項演算子または &&
3段以上の分岐❌ if/else または関数抽出
副作用(API呼び出しなど)を含む❌ if/else
null/undefinedの置換のみ❌ ??演算子

三項演算子は、「2つの選択肢、1行、値の返却」のすべてが当てはまる場合にのみ使用します。1つでも当てはまらない場合は、if/elseの方が適切です。


重要なポイント: 三項演算子は 条件 ? A : B — 2つの値のいずれかを選択する式(エク​​スプレッション)です。入れ子にすると読みにくくなるため、分岐が増えた場合はif/elseに戻りましょう。

💬 質問・コメント

0件のコメント

ログインせずに投稿できます。ゲスト投稿は投稿者自身で編集・削除できません。

0/2000

読み込み中...