JavaScript で変数が未定義かどうかをテストする最も適切な方法は何ですか?
いくつかの可能な方法を見てきました:
if (window.myVariable)
または
if (typeof(myVariable) != "undefined")
または
if (myVariable) // This throws an error if undefined. Should this be in Try/Catch?
ベストアンサー1
変数がその値に関係なく宣言されているかどうかを確認したい場合は、演算子を使用するのがin
最も安全な方法です。次の例を検討してください。
// global scope
var theFu; // theFu has been declared, but its value is undefined
typeof theFu; // "undefined"
ただし、変数またはプロパティは宣言されているが初期化されていないため、場合によってはこれが意図した結果にならないことがあります。in
より堅牢なチェックを行うには、演算子を使用します。
"theFu" in window; // true
"theFoo" in window; // false
変数が宣言されていないか、値 を持っているかどうかを知りたい場合は、文字列を返すことが保証されている 演算子undefined
を使用します。typeof
if (typeof myVar !== 'undefined')
直接比較すると上書きされる可能性undefined
があるため面倒ですundefined
。
window.undefined = "foo";
"foo" == undefined // true
@CMS が指摘したように、これは ECMAScript 第 5 版で修正されており、undefined
書き込み不可になっています。
if (window.myVar)
これらの偽の値も含まれるため、あまり堅牢ではありません。
間違い 0 「」 非N ヌル 未定義
3 番目のケース - が 2 つのケースでエラーをスローする可能性があることを指摘してくれた @CMS に感謝しますif (myVariable)
。1 つ目は、変数が定義されていない場合で、 がスローされますReferenceError
。
// abc was never declared.
if (abc) {
// ReferenceError: abc is not defined
}
もう1つのケースは、変数が定義されているが、呼び出されるとエラーをスローするゲッター関数がある場合です。たとえば、
// or it's a property that can throw an error
Object.defineProperty(window, "myVariable", {
get: function() { throw new Error("W00t?"); },
set: undefined
});
if (myVariable) {
// Error: W00t?
}