オプションチェーン:nullやundefinedによるエラーを防ぐ

2024-04-02

オプションチェーンと配列と関数

オプションチェーンは、JavaScriptとTypeScriptで導入された新しい演算子 (?.?.[]) で、プロパティやメソッドが存在しない場合でもエラーを発生させずに値を取得できる便利な機能です。

従来のコードでは、ネストされたオブジェクトのプロパティやメソッドにアクセスする場合、存在チェックが必要でした。

const user = {
  address: {
    city: "Tokyo",
  },
};

// 従来のコード
const city = user?.address?.city; // "Tokyo"

// 存在チェックが必要
if (user && user.address && user.address.city) {
  const city = user.address.city;
}

オプションチェーンを使うと、存在チェックを省略できます。

// オプションチェーン
const city = user?.address?.city; // "Tokyo"

// 存在チェック不要

配列とオプションチェーン

オプションチェーンは、配列にも使用できます。

const numbers = [1, 2, 3];

// 従来のコード
const lastNumber = numbers[numbers.length - 1]; // 3

// 存在チェックが必要
if (numbers.length > 0) {
  const lastNumber = numbers[numbers.length - 1];
}

// オプションチェーン
const lastNumber = numbers?.[numbers.length - 1]; // 3

// 存在チェック不要

関数とオプションチェーン

const user = {
  getName() {
    return "John Doe";
  },
};

// 従来のコード
const name = user?.getName(); // "John Doe"

// 存在チェックが必要
if (user && user.getName) {
  const name = user.getName();
}

// オプションチェーン
const name = user?.getName(); // "John Doe"

// 存在チェック不要

オプションチェーンを使うと、コードを簡潔に書けるだけでなく、nullやundefinedによるエラーを防ぐことができます。

オプションチェーンは、存在チェックを省略できる便利な機能ですが、以下の点に注意する必要があります。

  • 存在チェックが必要な場合も、オプションチェーンを使うと意図せずエラーを抑制してしまう可能性があります。
  • オプションチェーンは、ネストされたオブジェクトや配列の深い階層にアクセスする場合、コードの見づらくなる可能性があります。

オプションチェーンは、JavaScriptとTypeScriptで配列と関数を操作する際に便利な機能です。コードを簡潔に書けるだけでなく、nullやundefinedによるエラーを防ぐことができます。ただし、注意点も理解した上で使用する必要があります。




オプションチェーンを使って、ネストされたオブジェクトのプロパティにアクセスする

const user = {
  address: {
    city: "Tokyo",
  },
};

// 従来のコード
const city = user?.address?.city; // "Tokyo"

// 存在チェックが必要
if (user && user.address && user.address.city) {
  const city = user.address.city;
}

// オプションチェーン
const city = user?.address?.city; // "Tokyo"

// 存在チェック不要

オプションチェーンを使って、配列の最後の要素を取得する

const numbers = [1, 2, 3];

// 従来のコード
const lastNumber = numbers[numbers.length - 1]; // 3

// 存在チェックが必要
if (numbers.length > 0) {
  const lastNumber = numbers[numbers.length - 1];
}

// オプションチェーン
const lastNumber = numbers?.[numbers.length - 1]; // 3

// 存在チェック不要

オプションチェーンを使って、関数を呼び出す

const user = {
  getName() {
    return "John Doe";
  },
};

// 従来のコード
const name = user?.getName(); // "John Doe"

// 存在チェックが必要
if (user && user.getName) {
  const name = user.getName();
}

// オプションチェーン
const name = user?.getName(); // "John Doe"

// 存在チェック不要

オプションチェーンを使って、nullやundefinedによるエラーを防ぐ

const user = null;

// 従来のコード
const name = user.getName(); // TypeError: Cannot read property 'getName' of null

// オプションチェーン
const name = user?.getName(); // undefined

// エラーが発生しない



従来のコード

オプションチェーンを使う前に、JavaScriptで長年使用されてきた従来のコードを見てみましょう。

const user = {
  address: {
    city: "Tokyo",
  },
};

// 従来のコード
const city = user.address ? user.address.city : undefined;

// 存在チェックが必要
if (user && user.address && user.address.city) {
  const city = user.address.city;
}

このコードは、user.addressuser.address.city が存在しない場合、undefined を返します。

エラーハンドリング

オプションチェーンを使わずにエラーハンドリングを行う方法もあります。

const user = {
  address: {
    city: "Tokyo",
  },
};

try {
  const city = user.address.city;
  // ...
} catch (error) {
  // エラー処理
}

null 許容演算子 (??) を使って、デフォルト値を設定することもできます。

const user = {
  address: {
    city: null,
  },
};

// null 許容演算子
const city = user.address?.city ?? "Unknown City"; // "Unknown City"

// デフォルト値を設定

このコードは、user.address.citynull または undefined の場合、デフォルト値 "Unknown City" を返します。

オプションチェーンは便利な機能ですが、必ずしも必要ではありません。コードの規模や複雑性、好みなどに合わせて、適切な方法を選択してください。


javascript arrays typescript


ブラウザ対応もバッチリ!JavaScriptで文字列の始まりを判定する3つの方法

JavaScriptには、String. prototype. startsWith()というメソッドが用意されています。このメソッドは、検索対象の文字列が指定された文字列で始まるかどうかを判定し、trueまたはfalseを返します。例:startsWith() メソッドの引数...


JavaScript、jQuery、DOMにおけるイベントリスナーのメモリ管理

条件:要素が参照フリーであること: 他のオブジェクトや変数から参照されていない状態 参照がなくなると、ガベージコレクションによってメモリから回収される要素が参照フリーであること:他のオブジェクトや変数から参照されていない状態参照がなくなると、ガベージコレクションによってメモリから回収される...


JavaScript、HTML、無限スクロール:ReactJS で双方向無限スクロールをモデリング

このチュートリアルを開始する前に、以下の知識が必要となります。ReactJS の基本知識JavaScript の基本知識HTML の基本知識双方向無限スクロールを実装するには、以下の手順を行います。コンポーネントを作成するまず、無限スクロール機能を管理するコンポーネントを作成する必要があります。このコンポーネントは、コンテンツをレンダリングし、スクロールイベントを処理する責任を負います。...


Angular 2 で長い相対パスを避けるための Node.js モジュールシステムと TypeScript aliases

この問題を解決するために、いくつかの方法があります。パスエイリアスを使用するTypeScript コンパイラーでは、paths コンパイラーオプションを使用して、カスタムパスエイリアスを定義できます。これにより、長い相 relative パスを短いエイリアスに置き換えることができます。...


型 'never' とは? TypeScriptで発生する「型 '型名' を型 'never' に割り当てることはできません」エラーの謎を解き明かす

TypeScriptで「型 '型名' を型 'never' に割り当てることはできません」というエラーが発生した場合、それは型システムが、ある値を特定の変数やパラメータに割り当てることが不可能であると判断していることを示しています。原因このエラーが発生する主な原因は以下の3つです。...