0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

オプショナルチェイニング演算子の理解とその効果

Posted at

※自分の学習メモとしても残しております。

オブジェクトに属するメソッドにアクセスするには、ドット演算を利用するのが基本。

オプショナルチェイニング演算子(?.)がない場合にエラーとなる理由は、null や undefined に対してメソッドを呼び出そうとすると、JavaScriptはそのオブジェクトが存在しないため、エラーを投げるからです。

オプショナルチェイニングがない場合の動作

次のコードを例に考えてみます。

const str = null;
console.log(str.substring(3));

この場合、str は null であり、substring(3) メソッドは null には存在しないため、以下のようなエラーが発生します。

TypeError: Cannot read properties of null (reading 'substring')

エラーが発生する理由

  1. null や undefined にはプロパティやメソッドがない
    null と undefined は特別な値であり、これらにはメソッドやプロパティが存在しません。
  2. メソッド呼び出しをしようとする
    str.substring(3) は、str がオブジェクトであり、substring というメソッドが存在することを前提にしています。しかし、str が null の場合、substring メソッドは存在しないため、JavaScriptエンジンは「プロパティ 'substring' を 'null' から読み取ることができない」というエラー(TypeError)をスローします。

オプショナルチェイニング演算子(?.)を使用する場合の動作

一方で、オプショナルチェイニング演算子(?.)を使用すると、JavaScriptは str が null または undefined かどうかをまず確認します。もしそうであれば、メソッド呼び出しをスキップして undefined を返すので、エラーを防ぎます。

以下のコードを例にしてみましょう。

const str = null;
console.log(str?.substring(3));  // undefined

このコードでは、str が null であるため、str?.substring(3) は単に undefined を返し、エラーは発生しません。

substring メソッドについて

substring メソッドは、文字列の指定した開始位置から部分文字列を返します。

たとえば、以下のように書くと

const str = "Hello, World!";
console.log(str.substring(3));  // "lo, World!"

この場合、substring(3) はインデックス3から始まる部分文字列、つまり "lo, World!" を返します。インデックスは0から始まるため、3は4番目の文字を指します。

substring と slice の違い

似たメソッドに slice があります。これらのメソッドはほとんど同じ動作をしますが、次の違いがあります。

  • substring は負の値を 0 として扱います
  • slice は負の値を文字列の末尾からの相対位置として扱います

この違いも頭に入れておくと、状況に応じて適切に使い分けることができます。

まとめ

オプショナルチェイニング演算子を使うことで、null や undefined に対して安全にプロパティやメソッドアクセスを試みることができ、これによってプログラムの実行中に予期せぬエラーが発生するのを防ぎます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?