一覧へ

オプションチェーン — ?. 演算子で安全にアクセス

JavaScriptのオプションチェーン演算子(?.)を使用して、null/undefinedエラーなしで安全にネストされたオブジェクトにアクセスする方法を説明します。

入門
|
5
|
検証済み (2026-07)
進捗0/55 (0%)

オプショナルチェイニング — ?.演算子による安全なアクセス

このトピックを終えると

?.演算子がなぜ必要で、どのように動作するのか、そして実務でどのような状況で使うのかを理解できます。


ネストされたオブジェクトの落とし穴

APIから取得したユーザーデータがあります。

javascript
const user = {
  name: "Alice",
  address: {
    city: "Seoul"
  }
};

console.log(user.address.city); // "Seoul"

しかし、一部のユーザーは住所を入力していません。

javascript
const user = { name: "Bob" };
console.log(user.address.city);
// TypeError: Cannot read properties of undefined

user.addressundefinedであるため、.cityを読み込もうとするとエラーが発生します。これはJavaScriptで最も一般的な実行時エラーの一つです。


従来の方法:if文の連鎖

javascript
let city;
if (user && user.address && user.address.city) {
  city = user.address.city;
}

毎回中間段階を確認する必要があります。ネストが深くなるほどコードが長くなります。


オプショナルチェイニング:?.

javascript
const city = user?.address?.city;

?.は、左側の値がnullまたはundefinedの場合に、エラーを発生させずにundefinedを返します

user?.address?.cityは、次のように読みます。

  • userが存在すれば.addressに進みます。
  • addressが存在すれば.cityに進みます。
  • どこかでnullまたはundefinedに遭遇したら、すぐにundefinedを返します。

1行で安全なアクセスが可能になります。


メソッドと配列にも適用

メソッドの呼び出しにも使用できます。

javascript
const result = user.getProfile?.();

getProfileが存在すれば呼び出し、存在しなければundefinedを返します。括弧の前に?.を付けます。

配列のインデックスアクセスにも使用できます。

javascript
const first = users?.[0]?.name;

users配列が存在しない場合や、空の配列であってもエラーは発生しません。


nullish結合(??)との組み合わせ

?.とよく一緒に使われるのが、**nullish結合演算子??**です。

javascript
const city = user?.address?.city ?? "Unknown";

?.で安全にアクセスし、結果がnullまたはundefinedの場合、??の後のデフォルト値を設定します。||とは異なり、0""(空文字列)を有効な値として扱います。

javascript
const count = data?.total ?? 0;   // totalが0の場合は0を維持
const count2 = data?.total || 0;  // totalが0の場合は0もfalsyなので0を返す(意図と異なる可能性がある)

過剰な使用に注意

?.が便利だからといって、すべての場所に付けるべきではありません。

javascript
// これは過剰です
const name = user?.name?.toString?.()?.trim?.();

user.nameが必ず存在する場合、?.を使用せずにアクセスする方が適切です。エラーが発生するのは、バグを見つけるためでもあります。

?.は、「この値が存在しない可能性がある」という意図をコードに伝えるものです。実際に存在しない可能性がある場所にのみ使用してください。


重要なポイント

?.は、null/undefinedに遭遇すると、エラーの代わりにundefinedを返します。 構造が不確かなデータ(APIレスポンスなど)にアクセスする際に使用します。 ??と組み合わせることで、デフォルト値まできれいに処理できます。

💬 質問・コメント

0件のコメント

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

0/2000

読み込み中...