TypeScript Deep Drive という TypeScript のバイブル的リファレンスに次のようなページがあります。
このページでは undefined を値として使用するのを推奨していません。
たとえば、値が undefined
かどうかを調べるにはnull
との比較を推奨していたり、
TypeScript// 👎 Not good...
obj.prop === undefined
// 👍 Better
obj.prop == null
ルートレベルの変数が定義されているかを判断するには typeof
の使用を推奨していたりします。
TypeScript// 👎 Not good...
globalObj === undefined
// 👍 Better
typeof globalObj === 'undefined'
ただ、Deep Driveにはundefined
を使用するべきではない具体的な理由が書かれていません。
代わりにESLintのno-undefined
ルールのドキュメントを見ると、その理由が書かれていました。
undefined
は代入可能なグローバルオブジェクトのプロパティです。ECMAScript 3ではundefined
を上書きすることができます。ECMAScriptではグローバルのundefined
を上書きできなくなりましたが(代入はできる)、スコープ変数としてundefined
をシャドーウィングすることができます。
https://eslint.org/docs/rules/no-undefined
つまり、undefined
は代入可能な変数なため、実装によってはundefined
に値が割り当てられることがあるようです。
TypeScript// ES3
// グローバルな undefined を上書き
window.undefined = 1;
var obj = {};
obj.prop === undefined; // false
TypeScript// ES5
// foo() 内の undefined を上書き
const foo = () => {
const undefined = 1;
var obj = {};
obj.prop === undefined; // false
};
no-undefined
ルールではundefined
に関するスタイルガイドを次のようにしています。
undefined
は初期化されていない変数にのみ使用するundefined
かどうかの判定はtypeof
演算子を使用するまた、再代入・シャドーウィングによるundefined
の上書きはno-global-assign
ルールおよびno-shadow-restricted-names
ルールを使用することで回避することもできます。
なお、no-undefined
ルールはrecommended
を始めとしてairbnb
・standard
・google
いずれのプリセットでも有効化されていません。