本文へスキップ
BecomeCoder

JavaScriptコース · 第9章 モダンな書き方 ― 実務のJavaScript · レッスン33

オプショナルチェイニングとNull合体 ― 安全に取り出す

ブラウザで完結

導入

深いオブジェクトから値を取り出すとき、途中が無いとエラーになります。?.(オプショナルチェイニング)と ??(Null合体)を使うと、無いときも落ちない安全なコードが書けます。ES2020 で入った、いまや必須の記法です。

説明

?. は、手前が null / undefined なら、その先を読まずに undefined を返します(エラーになりません)。

const user = { name: "太郎", address: { city: "東京" } };
console.log(user.address?.city);   // 東京
console.log(user.company?.name);   // undefined(company が無くてもエラーにならない)

?? は、左が null / undefined のときだけ右の値を使います。「値が無ければ既定値」を安全に書けます。

const guest = { name: null };
console.log(guest.name ?? "ゲスト");  // ゲスト

似た || との違いが重要です。||0""(空文字)も「無し」とみなしてしまいますが、??null / undefined だけを対象にします。「0 や空文字を正しい値として残したい」ときは ?? を使います。

console.log(0 || 100);   // 100 ← 0 が「無し」扱いされてしまう
console.log(0 ?? 100);   // 0   ← 0 はちゃんと残る
console.log("" ?? "既定"); // ""  ← 空文字も残る

?.?? は組み合わせられます。

const data = {};
console.log(data.user?.name ?? "名無し");  // 名無し

やってみよう

user から存在しないプロパティを ?. で読んでみたり、0"" に対して ||?? の結果が変わることを確かめましょう。

演習

const config = { retries: 0 }; に対して、config.retries ?? 3 を表示してください。0 が既定値に置き換えられず、そのまま残ることを確かめます。

ヒント1を見る

console.log(config.retries ?? 3);

実際に動かしてみよう

下のエディタにJavaScriptを書いて「実行」を押すと、ブラウザ内のJavaScriptで出力が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう(console.log の結果が下に出ます。input() を使う回は「標準入力」欄に値を入れてから実行します)。

JavaScript — ブラウザ内で実行

ブラウザ本体のJavaScriptで実行する学習用環境を読み込みます(外部エンジン不要・軽量です)。
スクロールして表示された時点でも自動で読み込まれます。