Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2020年7月以降、すべてのブラウザーで利用可能です。
オプショナルチェーン演算子 (?.) (optional chaining) は、オブジェクトのプロパティにアクセスしたり、関数を呼び出したりします。この演算子を使用してアクセスするオブジェクトまたは呼び出される関数が undefined または null の場合、エラーが発生することなく、式が途中で終了し、undefined と評価されます。
?. 演算子の機能は . チェーン演算子と似ていますが、参照がヌル値(null または undefined)の場合にエラーとなるのではなく、式が短絡され undefined が返されるところが異なります。関数呼び出しで使用すると、与えられた関数が存在しない場合、 undefined を返します。
これは、参照が失われた可能性のある連結されたプロパティにアクセスする時、結果的に短く単純な式になります。また、必要なプロパティの存在が保証されていない場合にオブジェクトのコンテンツを探索するのにも役立ちます。
たとえば、入れ子構造を持つオブジェクト obj を考えましょう。オプショナルチェーン演算子なしで深い入れ子になったサブプロパティにアクセスするには、次のように、各プロパティ間の参照を確認する必要があります。
obj.first の値が null ではない(そして undefined でもない)ことが確認された後で、obj.first.second の値にアクセスします。これにより、obj.first をテストせずに直接 obj.first.second にアクセスした場合に発生するエラーを防ぐことができます。
これは JavaScript でよく使われるパターンですが、チェーンが長くなると冗長になり、安全ではありません。例えば、obj.first が偽値で、null や undefined ではない値(例えば 0)であった場合、それでも短絡となり、nestedProp が 0 になります。これは望ましくないかもしれません。
しかし、オプショナルチェーン演算子 (?.) を使えば、obj.first.second にアクセスしようとする前に obj.first の状態を明示的にテストする必要がなくなります。
?. を . の代わりに用いることで、 JavaScript が obj.first.second にアクセスしようとする前に obj.first が null または undefined でないことを暗黙的に確かめるようになります。obj.first が null または undefined であった場合、式が自動的に短絡され、 undefined が返ります。
これは、一時的な変数が作成されないことを除き、次の式と等価です。
オプショナルチェーンは、宣言されていないルートオブジェクトでは使用できませんが、値が undefined のルートオブジェクトでは使用することができます。
存在しない可能性がある関数の呼び出しを試行するときに、オプショナルチェーンを使うことができます。これはたとえば、ユーザーの端末上で使えなかったり、実装が古かったりするために使えなかったりする可能性がある API を使うときに役立ちます。
関数呼び出しでオプショナルチェーン演算子を用いた場合、メソッドが見つからないときは自動的に undefined が返り、例外は発生しません。
しかし、そのような名前のプロパティが関数でない場合、?. を使用しても、TypeError 例外 "someInterface.customMethod is not a function" が発生します。
メモ: 関数ではない名前のプロパティがあった場合、 ?. を使用すると TypeError 例外が発生します ("someInterface is null")。 もし someInterface 自体が null または undefined である可能性がある場合は、この位置にも ?. を使用する必要があります。つまり、someInterface?.customMethod?.() のように指定します。
eval?.() は間接的 eval モードに入るための最短の方法です。
ブラケット記法を使用して式のプロパティにアクセスする際にも、オプショナルチェーン演算子を使用することができます。
これは配列の添字でアクセスする際に角括弧を使用する必要があるため、配列に対して特に有益な機能です。
オプショナルチェーン式の評価結果に値を代入しようとすることは不正な処理です。
テンプレートリテラルタグはオプショナルチェーンにはできません(SyntaxError: tagged template cannot be used with optional chainを参照)。
new 式のコンストラクターはオプショナルチェーンを使用できません(SyntaxError: new keyword cannot be used with an optional chain を参照)。
オプショナルチェーン式を使用する場合、左オペランドが null または undefined の場合、その式は評価されません。例えば次のようになります。
その後のプロパティへのアクセスも評価されません。
これは下記のものと等価です。
ただし、この短絡評価の動作は、プロパティにアクセスする一連の「チェーン」を連続して行う場合のみ発生します。 チェーンの一部をグループ化しても、その後のプロパティへのアクセスは引き続き評価されます。
これは下記のものと等価です。
ただし、temp 変数は作成されません。
次の例では、マップに存在しない CSS メンバーの name プロパティを取得しようとしています。したがって、結果は undefined になります。
コールバックやオブジェクトからのフェッチメソッドを構造分解パターンで使用する場合、存在しない値を持つ可能性があるため、その存在を検査しない限り、その値を関数として呼び出すことはできません。?. を使用すると、この余分な検査を避けることができます。
入れ子になったオブジェクトでは、オプショナルチェーン演算子を何度でも使うことができます。
ヌル値合体演算子をオプショナルチェーンの後につけることで、値が存在しなかったときの既定値を指定することができます。
| ECMAScript® 2027 Language Specification # prod-OptionalExpression |
ブラウザー互換性一覧表を表示するには、JavaScript を有効にしてください。
より良いインターネットのための青写真。
このコンテンツの一部は、©1998–2026 個人の mozilla.org 協力者です。コンテンツはクリエイティブ・コモンズ・ライセンスのもとで利用できます。