TypeScriptコンパイラはなぜオプションの連鎖とヌル結合演算子、?.
および??
、から
// x?.y
x === null || x === void 0 ? void 0 : x.y;
// x ?? y
x !== null && x !== void 0 ? x : y
の代わりに
// x?.y
x == null ? void 0 : x.y
// x ?? y
x != null ? x : y
?
おそらく、舞台裏では== null
同じ 2 つのチェックが行われますが、コードの長さを考慮しても、単一のチェックの方がすっきりしているようです。オプションの連鎖の文字列を使用する場合、追加される括弧も大幅に少なくなります。
ちなみに、オプショナルチェーンがコンパイルされないことにも驚きました
x == null ? x : x.y
保存するnull
vs.undefined
これにはその後答えが出ています:JavaScript のオプション チェーンでは、null を保持する代わりに undefined を使用するのはなぜですか?
ベストアンサー1
信頼できる答えは以下にあります。マイクロソフト/TypeScript#16(古いですね)具体的にはこのコメント:
これは
document.all
、下位互換性のために言語内で特別な扱いを受ける癖 [...] のためです。document.all == null // true document.all === null || document.all === undefined // false
オプションの連鎖提案では
document.all?.foo === document.all.foo
しかし、
document.all == null ? void 0 : document.all.foo
誤って が返されますvoid 0
。
だから、特定の特異な、廃止された、時代遅れの、奇妙な、遺産疑似プロパティ型のエッジケースHTMLAllCollection
誰も使用していないもので、 または と大まかに等しいが、厳密にはまたはnull
と等しくありません。すごい!undefined
null
誰も真剣に検討していないようだ速報のものになりますdocument.all
。また、このxxx === null || xxx === undefined
バージョンはすべての状況で機能するため、仕様に従って動作する下位互換性のある JS コードを生成する最も簡単な方法であると考えられます。