JavaScript

オプショナル チェイニング演算子「?.」

 編集:2022.08.07 by T.A.

接続されたオブジェクト チェーンの深くに位置するプロパティの値を、チェーン内の各参照が正しいかどうかを明示的に確認せずに読み込むことを可能にします。

?. 演算子の機能は「.」チェーン演算子と似ていますが、参照が nullish(null または undefined)の場合にエラーとなるのではなく、式が短絡され undefined が返されるところが異なります。関数呼び出しで使用すると、与えられた関数が存在しない場合、undefined を返します。

obj.val?.prop
obj.val?.[expr]
obj ¶オブジェクト
val
prop プロパティ?
expr ¶式?。
obj.arr?.[index]
arr ¶配列
index ¶数値に評価?
obj.func?.(args)
func ¶関数
args

オプショナル チェイニング演算子は、参照や関数が undefined または null である可能性がある場合でも、接続されたオブジェクトの値に簡単にアクセスする手段を提供します。

たとえば、入れ子構造を持つオブジェクト obj を考えましょう。オプショナル チェイニング演算子なしで深い入れ子になったサブ プロパティにアクセスするには、次のように、各プロパティ間の参照を確認する必要があります:

let nestedProp = obj.first && obj.first.second;

obj.first.second の値にアクセスする前に、obj.first の値が null または undefined でないことを確認します。これにより、 obj.first をテストせずに直接 obj.first.second にアクセスしたときに起きるエラーを防ぐことができます。

しかし、オプショナル チェイニング演算子(?.)を使えば、obj.first.second にアクセスしようとする前に obj.first の状態を明示的にテストする必要がなくなります:

let nestedProp = obj.first?.second;

「?.」を「.」の代わりに用いることで、JavaScript が obj.first.second にアクセスしようとする前に obj.first が null または undefined でないことを暗黙的に確かめるようになります。obj.first が null または undefined であった場合、式が自動的に短絡され、undefined が返ります。

これは、一時的な変数が作成されないことを除き、次の式と等価です:

let temp = obj.first;
let nestedProp = ((temp === null || temp === undefined) ? undefined : temp.second);
Obj={}
D=Obj.prop;	//=undefined
D=Obj?.prop;	//=undefined: つまり「?.」を使う意味なし
Obj={}
D=Obj.p.second;	//エラー発生
D=Obj.p?.second;	//=undefined
Obj={p:{q:10}};
D=Obj.p?.["q"]; //=10
Obj={p:{}};
D=Obj.p?.["q"]; //=undefined
D=Obj.p.["q"];  //エラー発生
Obj={p:[10, 20, 30]};
D=Obj.p?.[1]; //=20
Obj={p:[]};
D=Obj.p?.[1]; //=undefined
D=Obj.p.[1];  //エラー発生
Obj={
  Prop:function(Para){},
  get Prop(){},
  set Prop(Val){this.L=this.L+Val},
  L:"開始"
};
D=Obj.Prop?.(Val);

どうすれば正常な値が得られるのか不明

¶省く


テスト