オプションチェイニングとNull合体演算子をマスターして、安全なコードを書こう

2024-04-02

JavaScriptにおけるNull合体演算子(??)

従来の解決策

従来、nullまたはundefinedの値を処理するには、以下の方法がありました。

// 変数にデフォルト値を設定
const name = user?.name ?? "名無し";

// 三項演算子を使用
const age = user?.age ? user.age : -1;

// if文を使用
if (user && user.address) {
  const city = user.address.city;
} else {
  const city = "不明";
}

これらの方法は有効ですが、冗長でコードの見通しが悪くなります。

Null合体演算子の登場

そこで、ES2020で導入されたのがnull合体演算子(??)です。この演算子は、左側の式がnullまたはundefinedの場合、右側の式を返すというシンプルなものです。

// null合体演算子を使用
const name = user?.name ?? "名無し"; // user.nameがnullまたはundefinedなら"名無し"を返す

// オプションチェイニングと組み合わせて使用
const city = user?.address?.city ?? "不明"; // user.addressがnullまたはundefinedなら"不明"を返す

上記のように、null合体演算子を使用することで、コードをより簡潔に書くことができます。

  • null合体演算子は、nullundefinedのみを区別します。0や空文字("")は、null合体演算子の対象になりません。
  • 左側の式がnullまたはundefinedでない場合、右側の式は評価されません。

JavaScriptのnull合体演算子は、nullまたはundefinedの値を処理する際に非常に便利な演算子です。コードを簡潔に、読みやすくするために、ぜひ活用してみましょう。




ユーザー情報の取得

const user = {
  name: "山田太郎",
  age: 30,
  address: {
    city: "東京",
    prefecture: "東京都",
  },
};

// ユーザーの名前を取得
const name = user?.name ?? "名無し";
console.log(name); // 山田太郎

// ユーザーの年齢を取得
const age = user?.age ?? -1;
console.log(age); // 30

// ユーザーの住所を取得
const city = user?.address?.city ?? "不明";
console.log(city); // 東京

// ユーザーが存在しない場合
const unknownUser = null;

// 存在しないユーザーの名前を取得
const unknownName = unknownUser?.name ?? "名無し";
console.log(unknownName); // 名無し

オプションチェイニングとの組み合わせ

const user = {
  name: "山田太郎",
  age: 30,
  address: {
    city: "東京",
    prefecture: "東京都",
  },
};

// ユーザーの住所の郵便番号を取得
const zipCode = user?.address?.postalCode ?? "不明";
console.log(zipCode); // 100-0001

// ユーザーが存在しない場合
const unknownUser = null;

// 存在しないユーザーの住所の郵便番号を取得
const unknownZipCode = unknownUser?.address?.postalCode ?? "不明";
console.log(unknownZipCode); // 不明

デフォルト値の設定

const name = "山田太郎";

// 名前が存在しない場合は"名無し"を設定
const displayName = name ?? "名無し";
console.log(displayName); // 山田太郎

// 名前が空文字("")の場合は"名無し"を設定
const emptyName = "";

// 空文字("")もnull合体演算子の対象になることに注意
const emptyDisplayName = emptyName ?? "名無し";
console.log(emptyDisplayName); // 名無し



Null合体演算子の代替方法

const name = user.name || "名無し";
const age = user.age || -1;
const city = user.address?.city || "不明";

三項演算子

const name = user.name ? user.name : "名無し";
const age = user.age ? user.age : -1;
const city = user.address?.city ? user.address?.city : "不明";

if文

let name;
if (user && user.name) {
  name = user.name;
} else {
  name = "名無し";
}

let age;
if (user && user.age) {
  age = user.age;
} else {
  age = -1;
}

let city;
if (user && user.address && user.address.city) {
  city = user.address.city;
} else {
  city = "不明";
}

各方法の比較

方法メリットデメリット
Null合体演算子簡潔2020年以降のブラウザでのみ使用可能
論理OR演算子汎用性が高い0や空文字("")もデフォルト値として扱われる
三項演算子読みやすい冗長になりやすい
if文柔軟性が高い最も冗長

Null合体演算子は、簡潔で読みやすいコードを書きたい場合に最適な選択肢です。ただし、2020年以降のブラウザでのみ使用可能であることに注意が必要です。

ブラウザの互換性を考慮する必要がある場合は、論理OR演算子や三項演算子などの代替方法を使用することを検討してください。

  • オプションチェイニング演算子 (?.) と組み合わせることで、より安全なコードを書くことができます。
  • デフォルト値を設定する場合は、null合体演算子の代わりにデフォルト引数を使用することもできます。

javascript operators null-coalescing-operator


ユーザーインターフェースの改善: テキストボックスにフォーカスが当たるとすべての内容を選択する方法 (Vanilla JS & jQuery)

これは最も簡単な方法です。テキストボックスにフォーカスが当たった時に select() メソッドを呼び出すだけです。この方法は、より細かく制御したい場合に役立ちます。setSelectionRange() メソッドを使えば、選択範囲の開始位置と終了位置を指定できます。...


【超解説】JavaScriptでオブジェクトの配列を安全にコピーする方法:浅いコピー、深いコピー、ライブラリ

浅いコピー とは、元の配列の参照を新しい配列にコピーするだけです。つまり、新しい配列内のオブジェクトは、元の配列と同じオブジェクトを参照します。オブジェクトを変更すると、元の配列と新しい配列の両方に影響します。深いコピー とは、元の配列の各オブジェクトのコピーを作成し、新しい配列に格納します。つまり、新しい配列内のオブジェクトは、元の配列とは別のオブジェクトになります。オブジェクトを変更しても、元の配列には影響しません。...


【徹底解説】JavaScript、CSS、DOMでスクロールバーの表示を確認する方法

ここでは、JavaScript、CSS、DOM を用いてスクロールバーの表示を確認する方法を、それぞれ詳しく解説します。JavaScript では、以下のプロパティを用いてスクロールバーの表示状態を確認することができます。overflow-x: 要素の水平方向のスクロールバーの表示状態を制御します。...


fs.realpathSync() と path.dirname() を使って親フォルダを見つける

このチュートリアルでは、JavaScript、Node. js、およびファイルシステムを使用して、現在のフォルダの親フォルダを見つける方法について説明します。要件このチュートリアルを完了するには、以下のものが必要です。基本的な JavaScript の知識...


【保存版】Node.jsファイル操作:読み込み、書き込み、削除完全ガイド

fs. readFileSyncは、ファイルを同期的に読み込む関数です。同期処理なので、関数が終了するまで他の処理は実行されません。このコードは、text. txtファイルをutf8エンコーディングで読み込み、その内容をコンソールに出力します。...