1. ニックネームがあればそれを返す
  2. ニックネームが null なら本名を返す
  3. 空文字はニックネームとして扱いそのまま返す
  4. どちらも null なら名無しを返す
  5. 引数を渡さず undefined でも名無しを返す
コース一覧
JavaScript入門:コードを動かす
?? で既定値を用意する

JavaScript入門:コードを動かす

HTML に JavaScript を読み込むところから始め、コンソール、文字列と数値、let と const、データ型、型変換、比較・論理・三項・null 合体演算子を学ぶ全 23 レッスン(335 分)の入門コースです。最後は、変数と式を使ってプロフィールの見出し用の値を組み立てます。if 文、配列とループ、DOM 操作は後続コースで扱います。

1
はじめての JavaScript
01. HTML に JavaScript を読み込む5分
02. console.log で表示する15分
03. 文字列を連結する15分
04. 四則演算15分
05. コメントで意図を残す15分
06. エラーを読んでみる15分
07. つくる 起動メッセージ20分
08. 第1章まとめクイズ10分
2
変数とデータ型
01. let と const を使い分ける15分
02. typeof で型を調べる15分
03. 型を変換する15分
04. 真偽値と falsy な値15分
05. null と undefined を見分ける15分
06. テンプレートリテラル15分
07. つくる プロフィールを変数にする20分
08. 第2章まとめクイズ10分
3
演算子と式
01. 比較演算子と ===15分
02. 論理演算子と短絡評価15分
03. 三項演算子で簡潔に15分
04. ?? で既定値を用意する15分
05. 演算子の優先順位15分
06. つくる 表示名を決める20分
07. 第3章まとめクイズ10分

?? で既定値を用意する

?? と || の違い
解説

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

  • A ?? B は A が null か undefined のときだけ B を返します
  • || は falsy すべてに反応するので、0 や空文字まで既定値に置き換えてしまいます

閲覧数 0 の作品が「未計測」と表示される

値が未設定のときに代わりの値を出す処理は、アプリを作るとほぼ必ず登場します。前のレッスンの || を使えば、左が空っぽのときに右へ倒せます。ところが、この書き方には落とし穴があります。

JavaScript

const views = 0; // 計測はできていて、結果が 0 だった console.log("閲覧数 " + (views || "未計測")); // 閲覧数 未計測

計測できていないわけではないのに、「未計測」と表示されてしまいました。0 は falsy なので、|| が右辺に切り替えたからです。|| は「空っぽに見えるもの」すべてに反応する、というのが原因です。

?? が反応するのは null と undefined だけ

?? は null 合体演算子と呼び、左辺が null か undefined のときだけ右辺を返します。0 や空文字はそのまま残ります。

左辺の値左辺 || "既定値"左辺 ?? "既定値"
"人気""人気""人気"
null"既定値""既定値"
undefined"既定値""既定値"
0"既定値"0
"""既定値"""
false"既定値"false

下の 3 行が要点です。0 "" false は「値が入っていない」のではなく「その値が入っている」状態です。?? はそれを尊重して、そのまま返します。

JavaScript

console.log(0 || "未計測"); // 未計測 0 が消える console.log(0 ?? "未計測"); // 0 0 が残る console.log("" || "未入力"); // 未入力 console.log("" ?? "未入力"); // 空文字がそのまま返る
解説

使い分けの目安は次のとおりです。「値が存在しないときだけ埋めたい」なら ??、「空欄もまとめて埋めたい」なら || です。空文字を未入力とみなしたい欄なら || のほうが正しい、という場面もあります。どちらが正しいかは仕様が決めます。

つなげると候補の優先順位になる

?? は連続して書けます。左から順に見ていき、最初に null でも undefined でもない値が採用されます。外から来たデータを画面に出すときに効いてきます。API の返す JSON、フォームの入力値、保存された設定。どれも「その項目が無い」ことがふつうに起こります。

JavaScript

const saved = { theme: null, fontSize: 0 }; const preset = { theme: "dark" }; console.log(saved.theme ?? preset.theme ?? "light"); // dark 左から順に採用 console.log(saved.fontSize ?? 16); // 0 そのまま残る console.log(saved.language ?? "ja"); // ja 項目が無いので既定値

fontSize に注目してください。0 という設定値が入っているので、?? はそれを尊重します。|| を使っていたら 16 に書き換わり、ユーザーがわざわざ 0 に設定した意味が消えます。ユーザーが選んだ値を勝手に上書きしない、という点で ?? は誠実な演算子です。

なお、渡されなかった引数は undefined になります。?? は undefined にも反応するので、引数を渡し忘れた呼び出しでも既定値へ倒れて壊れません。

よくある間違い

  • 0 を消してしまう — count || 10 は、count が 0 のとき 10 になります。件数や金額のように 0 に意味がある値には ?? を使ってください
  • ?? を || や && と括弧なしで混ぜる — a ?? b || c は SyntaxError です。どちらを先に評価するかが紛らわしいため、言語仕様として括弧を必須にしています。(a ?? b) || c のように、自分で書いて明示してください

JavaScript

// const theme = saved.theme ?? preset.theme || "light"; // SyntaxError const theme = (saved.theme ?? preset.theme) || "light"; // 括弧を書けば動く

要件

  1. 関数名は displayName、引数は nickname と fullName の 2 つにすること
  2. ?? を使い、null と undefined のときだけ次の候補に進むこと
  3. 空文字 "" はそのまま返すこと (|| を使うと空文字が消えてしまう)
  4. どちらも未設定なら文字列 "名無し" を返すこと

入出力例

displayName("たろう", "山田 太郎") → "たろう" displayName(null, "山田 太郎") → "山田 太郎" displayName("", "山田 太郎") → "" displayName(null, null) → "名無し" displayName() → "名無し"

ヒント

候補を優先順位の順に並べ、最初に見つかった値を返す形にします

`??` は連続して書けます。`a ?? b ?? c` で左から順に試せます

`||` に置き換えると空文字のテストだけが落ちます。falsy 全部に反応するか、null と undefined だけに反応するかの違いです

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

関連レッスン

  • 演算子の優先順位

    ひとつの式に複数の演算子が並んだとき、どれから評価されるかの順序を学びます。丸括弧で明示すれば順序を変えられます。

  • つくる 表示名を決める

    第3章の総まとめです。ニックネーム、肩書き、作品数から、プロフィールの見出しに出す値を演算子だけで決めます。

  • 第3章まとめクイズ

    第3章で学んだ比較演算子と ===、論理演算子と短絡評価、三項演算子、?? による既定値、演算子の優先順位を 5 問で確かめます。

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

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

  • 処理計算や代入を表す長方形
  • 演算子//は切り捨て除算(7 // 2 = 3)。
  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
  • APIアプリ間でデータをやり取りする窓口
  • applicationJSON 本文を送るときの Content-Type
  • フォームinput(text, email, password, checkbox, radio)、select、textarea、button。
  • 引数位置引数=順番で渡す。
  • 評価出力品質を数値化して継続改善する活動
main.js
学習モード
エディタを読み込んでいます

メモ

?? で既定値を用意する

⌘S で保存