カテゴリ: JavaScript 更新日: 2026/02/07

JavaScriptのオプショナルチェーン(?.演算子)をオブジェクト操作で活用しよう|初心者でもわかる使い方

JavaScriptのオプショナルチェーン(?.演算子)をオブジェクト操作で活用しよう
JavaScriptのオプショナルチェーン(?.演算子)をオブジェクト操作で活用しよう

先生と生徒の会話形式で理解しよう

生徒

「JavaScriptでオブジェクトの中にある情報を取り出したいけど、時々ないこともあってエラーが出ます。どうしたら安全に取り出せますか?」

先生

「そんなときはオプショナルチェーンという仕組みを使うと便利です。これはプロパティが存在しない場合でもエラーにならず、安全に値を取り出せますよ。」

生徒

「オプショナルチェーンってどんな書き方で、どうやって使うんですか?」

先生

「それでは基本から具体例を交えて丁寧に解説しますね!」

1. オプショナルチェーン(?.演算子)とは?

1. オプショナルチェーン(?.演算子)とは?
1. オプショナルチェーン(?.演算子)とは?

オプショナルチェーンは、JavaScriptの?.(ドットの前に?)という記号を使った機能で、「もしそのプロパティやメソッドがあれば取り出す・呼び出す、なければundefinedにする」という意味です。

普通にオブジェクトの深いプロパティにアクセスするときに、途中のどこかが存在しないとエラーになります。オプショナルチェーンを使うと、そんなエラーを防げます。

2. どうしてオプショナルチェーンが必要?

2. どうしてオプショナルチェーンが必要?
2. どうしてオプショナルチェーンが必要?

例えば、次のようなオブジェクトを考えます。


const user = {
  name: "花子",
  address: {
    city: "東京"
  }
};

ここで、ユーザーの住所の郵便番号(postalCode)を取り出そうとすると、addressには郵便番号がありません。直接アクセスするとエラーになります。


console.log(user.address.postalCode); // エラーになる場合があります

なぜなら、postalCodeundefinedだからではなく、address自体が存在しなければ「存在しないもののさらに中を見る」ためエラーが発生します。

オプショナルチェーンを使うと安全に取り出せるので、こう書きます。


console.log(user.address?.postalCode); // undefined と表示されるだけ

もしaddressがなければundefinedが返り、エラーにはなりません。

3. オプショナルチェーンの基本的な使い方

3. オプショナルチェーンの基本的な使い方
3. オプショナルチェーンの基本的な使い方

オプショナルチェーンは、次のように使います。

  • obj?.propobjがあればpropを取得、なければundefined
  • obj?.[expr] :動的なプロパティ名も安全にアクセス可能
  • obj.method?.() :メソッドがあれば呼び出し、なければ無視

例えばメソッド呼び出しの例です。


const user = {
  greet() {
    console.log("こんにちは!");
  }
};

user.greet?.();  // こんにちは! と表示される
user.farewell?.(); // 何も起こらない(エラーにならない)

4. 実践例:オブジェクトの深い階層の安全なアクセス

4. 実践例:オブジェクトの深い階層の安全なアクセス
4. 実践例:オブジェクトの深い階層の安全なアクセス

実際のWebアプリなどで、ユーザー情報の中にオプションで設定されている情報があるとします。


const user = {
  name: "花子",
  settings: {
    theme: "dark"
  }
};

もしsettingsが無かったらuser.settings.themeを取得しようとするとエラーです。オプショナルチェーンを使うとこうなります。


const theme = user.settings?.theme ?? "light";
console.log(theme); // settingsがなければ"light"が表示される

ここで使われている??は「null合体演算子」といい、左側がnullまたはundefinedのときだけ右側の値を使います。つまり、設定がなければ「light」というデフォルト値を使うことができます。

5. オプショナルチェーンでエラーを防ぐ理由

5. オプショナルチェーンでエラーを防ぐ理由
5. オプショナルチェーンでエラーを防ぐ理由

JavaScriptでプロパティを連続してアクセスするとき、途中のどこかがnullundefinedだと「存在しないプロパティを参照しました」というエラーが出ます。

オプショナルチェーンを使うと、途中でnullundefinedがあればそこで処理が止まり、エラーを起こさずにundefinedを返します。これにより、プログラムが途中で止まらずに済みます。

6. オプショナルチェーンはどんなときに使う?

6. オプショナルチェーンはどんなときに使う?
6. オプショナルチェーンはどんなときに使う?
  • APIから取得したデータの一部が無い可能性があるとき
  • ユーザー入力でオプションの情報があるかもしれないとき
  • 深い階層のオブジェクトに安全にアクセスしたいとき

プログラムのエラーを減らし、コードの安全性を高めたいときに役立ちます。

7. 注意点と補足

7. 注意点と補足
7. 注意点と補足
  • オプショナルチェーンは読み取り専用ではなく、メソッドの呼び出しにも使えます。
  • サポートされている環境で使う必要があります。古いブラウザでは動かないことがあります。
  • 演算子の後に続くものが存在しなければ、すぐにundefinedを返します。

まとめ

まとめ
まとめ

今回の記事では、JavaScript開発において欠かせないテクニックの一つである「オプショナルチェーン(?.演算子)」について詳しく解説してきました。モダンなJavaScriptの書き方として定着しているこの機能は、単にコードを短くするだけでなく、アプリケーション全体の堅牢性を高めるために非常に重要な役割を果たします。

Webアプリケーションを開発していると、外部のAPIからデータを取得したり、ユーザーの入力によってオブジェクトの構造が動的に変わったりすることは日常茶飯事です。そんな時、従来の方法では「if文を何重にも重ねてプロパティの存在を確認する」という、いわゆる「ピラミッド型のコード(深いネスト)」が発生しがちでした。しかし、オプショナルチェーンを活用することで、そうした煩雑な条件分岐を一行でスマートに記述できるようになります。

オプショナルチェーンの重要性とメリット

改めて、オプショナルチェーンを使うことの大きなメリットを整理してみましょう。最も大きな利点は「実行時エラー(Runtime Error)の回避」です。JavaScriptで最も頻繁に遭遇するエラーの一つである「Uncaught TypeError: Cannot read property 'xxx' of undefined」を未然に防ぐことができるため、ユーザー体験を損なう致命的な不具合を減らすことができます。

また、コードの可読性が飛躍的に向上する点も見逃せません。データの階層構造が深い場合でも、直感的に「もしあれば取得する」という意図をコード上で表現できるため、後から自分や他の開発者がコードを見返した際にも、その処理の内容をすぐに理解することができます。

実践的なサンプルプログラム:APIレスポンスの処理

ここでは、実際の現場でよく遭遇するシチュエーションを想定したサンプルプログラムを紹介します。ユーザーの詳細プロフィール情報が含まれている場合と、一部が欠落している場合の両方を想定した処理です。


// ダミーのユーザーデータ(プロフィール画像やSNS連携が未設定のパターン)
const userData = {
    id: 101,
    profile: {
        nickname: "Webクリエイター"
        // photoプロパティが存在しない
    }
};

// オプショナルチェーンを使わない従来の書き方(冗長でミスしやすい)
let oldImgUrl = "default.png";
if (userData.profile && userData.profile.photo && userData.profile.photo.url) {
    oldImgUrl = userData.profile.photo.url;
}

// オプショナルチェーンとnull合体演算子を組み合わせたモダンな書き方
const newImgUrl = userData.profile?.photo?.url ?? "default.png";

console.log("画像URL(従来):", oldImgUrl);
console.log("画像URL(モダン):", newImgUrl);

// 配列に対しても安全にアクセス可能
const firstInterest = userData.interests?.[0] ?? "趣味なし";
console.log("最初の興味:", firstInterest);

上記の実行結果は以下のようになります。


画像URL(従来): default.png
画像URL(モダン): default.png
最初の興味: 趣味なし

TypeScriptでの活用シーン

さらに、最近のフロントエンド開発で主流となっているTypeScriptにおいても、オプショナルチェーンは非常に強力な武器となります。インターフェースでプロパティを「?(オプション)」として定義している場合、TypeScriptコンパイラは「その値が存在しない可能性がある」ことを警告してくれます。その際、オプショナルチェーンを使うことで、型安全を保ちながら簡潔にコードを記述できるのです。


interface AppConfig {
    apiEndpoint?: string;
    timeout?: number;
    options?: {
        verbose?: boolean;
    };
}

const config: AppConfig = {
    timeout: 5000
};

// TypeScriptが自動的にundefinedの可能性を考慮してくれる
const isVerbose = config.options?.verbose ?? false;

console.log(`詳細ログ出力: ${isVerbose}`);

詳細ログ出力: false

おわりに

オプショナルチェーンは、一度その便利さを知ってしまうと、これまでの書き方には戻れないほど便利な機能です。もちろん、何でもかんでも「?.」をつければ良いというわけではありません。ビジネスロジック上「絶対に存在していなければならない値」に対しては、適切にエラーハンドリングを行い、エラーとして検知させることも重要です。

「あれば使う、なければデフォルト値を出す」という柔軟なデータの取り扱いには、今回学んだオプショナルチェーンとnull合体演算子のコンビネーションが最強の解決策となります。ぜひ、今日からのコーディングに取り入れて、より綺麗で安全なJavaScript/TypeScriptコードを目指してみてください。

先生と生徒の振り返り会話

生徒

先生、ありがとうございました!まとめを読んで、オプショナルチェーンが単なる短縮形じゃなくて、エラーからプログラムを守るための守護神みたいな存在だってことがよく分かりました。

先生

守護神とは素晴らしい表現ですね。特に「?.」の後に「??」を続けて使うテクニックは、デフォルト値を設定する際によく使う黄金パターンなので、セットで覚えておくと開発がぐっと楽になりますよ。

生徒

はい!「データがあるかないか分からない不安」がなくなって、コードを書くのがもっと楽しくなりそうです。TypeScriptでの使い方も、型定義と一緒に使うとすごく便利そうですね。

先生

そうですね。TypeScriptでは型の定義(インターフェース)でも「?」を使いますし、実際の値へのアクセスでも「?.」を使うので、一貫性があって非常に書きやすいはずです。ただ、古いブラウザ(IEなど)をサポートしなければならない現場では、Babelなどのトランスパイル設定が必要になることも覚えておいてくださいね。

生徒

なるほど、環境への配慮も大事なんですね。でも今のブラウザならほとんど問題なさそうなので、積極的に使っていこうと思います。配列のアクセスにも「?.[0]」みたいに使えるのは驚きでした!

先生

その通りです。ブラケット記法([])にも使えるのは、動的なキーや配列を扱うときに重宝します。これで、どんなに複雑なオブジェクトが来ても怖くありませんね。次はもっと高度な非同期処理での活用方法なども見ていきましょうか。

関連記事:
カテゴリの一覧へ
新着記事
New1
TypeScript
TypeScriptでパスエイリアスを設定する方法!baseUrlとpathsでコードをスッキリ整理
New2
JavaScript
JavaScriptのfor文の書き方を初心者向けにやさしく解説
New3
JavaScript
JavaScriptの関数でよくあるエラーとその解決法まとめ
New4
JavaScript
JavaScriptのイベント処理でよくあるエラーとその対処法
人気記事
No.1
Java&Spring記事人気No1
JavaScript
JavaScriptのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.2
Java&Spring記事人気No2
JavaScript
JavaScriptのマウスイベントの使い方(click, mouseoverなど)
No.3
Java&Spring記事人気No3
JavaScript
JavaScriptのtoStringとString関数の違いを初心者向けに解説
No.4
Java&Spring記事人気No4
JavaScript
JavaScriptの純粋関数(pure function)と副作用の違いを理解しよう
No.5
Java&Spring記事人気No5
JavaScript
JavaScriptプログラムの実行方法まとめ!ブラウザ・Node.js・コンソールの使い方
No.6
Java&Spring記事人気No6
JavaScript
JavaScriptで文字列をforループで1文字ずつ処理する方法!初心者向け解説
No.7
Java&Spring記事人気No7
JavaScript
JavaScriptのDOMContentLoadedとloadイベントの違いを理解しよう
No.8
Java&Spring記事人気No8
TypeScript
TypeScriptの始め方:開発環境の構築手順【初心者向け】