「変数が定義されていないか、初期化されていない場合は、宣言して初期化する」ための信頼できる演算子を選択しようとしています。
ECMA-262 に準拠したホストで変数を条件付きで宣言することはできません。グローバル変数はグローバル (ウィンドウ) オブジェクトのプロパティになるため、グローバル変数の存在をテストすることができます (ただし、それらがグローバル変数として作成されたのか、プロパティとして作成されたのかはわかりません)。グローバルをテストするには:
// In global scope:
var global = this;
// Wherever:
if (global.hasOwnProperty('foo')) { // throws an error in IE
// foo is a property of the global object
}
変数オブジェクトまたは実行コンテキスト オブジェクトにアクセスしてテストすることはできないため、ローカル変数 (関数内など) をテストすることはできません。実行できるのは、テストundefined
または使用try..catch
(醜い) だけです。しかし、それを行う必要があるのは、非常に貧弱な設計です。
グローバル オブジェクトのプロパティを条件付きで作成することを意図している場合、上記の結果は次のようになります。
if (!global.hasOwnProperty('foo')) { // throws an error in IE
global.foo = 'whatever';
}
ただし、プロパティに値が割り当てられているかどうかもテストする場合は、次のようにします。
if (typeof global.foo == 'undefined') { // works everywhere
上記が true を返した場合、宣言されていないか、値が割り当てられていないか、または の値が割り当てられているかのように、より適切に思われますundefined
。どのような場合でも、値を割り当てたいと思うでしょう。
その値を持つ唯一の方法は、明示的に割り当てられた場合 (つまり、プロパティが存在し、値が割り当てられていることを意味します) であるため、テストnull
は賢明ではないようです。