如果JavaScript中未定义变量,最合适的测试方法是什么?

我见过几种可能的方法:

if (window.myVariable)

Or

if (typeof(myVariable) != "undefined")

Or

if (myVariable) // This throws an error if undefined. Should this be in Try/Catch?

当前回答

    var x;
    if (x === undefined) {
        alert ("I am declared, but not defined.")
    };
    if (typeof y === "undefined") {
        alert ("I am not even declared.")
    };

    /* One more thing to understand: typeof ==='undefined' also checks 
       for if a variable is declared, but no value is assigned. In other 
       words, the variable is declared, but not defined. */

    // Will repeat above logic of x for typeof === 'undefined'
    if (x === undefined) {
        alert ("I am declared, but not defined.")
    };
    /* So typeof === 'undefined' works for both, but x === undefined 
       only works for a variable which is at least declared. */

    /* Say if I try using typeof === undefined (not in quotes) for 
       a variable which is not even declared, we will get run a 
       time error. */

    if (z === undefined) {
        alert ("I am neither declared nor defined.")
    };
    // I got this error for z ReferenceError: z is not defined 

其他回答

在本文中,我了解到Undercore.js等框架使用此函数:

function isUndefined(obj){
    return obj === void 0;
}

我知道检查undefined最可靠的方法是使用void 0。

这与较新和较旧的浏览器都兼容,并且不能像window那样被覆盖。在某些情况下,未定义的浏览器可以被覆盖。

if( myVar === void 0){
    //yup it's undefined
}
if (typeof foo == 'undefined') {
 // Do something
};

注意,在这种情况下不需要严格比较(!==),因为typeof将始终返回字符串。

// x has not been defined before
if (typeof x === 'undefined') { // Evaluates to true without errors.
   // These statements execute.
}

if (x === undefined) { // Throws a ReferenceError

}

如果您有兴趣了解变量是否已声明,而不管其值如何,那么使用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

如果您想知道变量是否尚未声明或值未定义,请使用typeof运算符,它保证返回字符串:

if (typeof myVar !== 'undefined')

与undefined的直接比较很麻烦,因为undefineed可以被覆盖。

window.undefined = "foo";
"foo" == undefined // true

正如@CMS所指出的,这已经在ECMAScript第5版中修补,undefined是不可写的。

if(window.myVar)也将包含这些虚假值,因此它不是很健壮:

false
0
""
NaN
null
undefined

感谢@CMS指出您的第三种情况-if(myVariable)在两种情况下也会抛出错误。第一种情况是尚未定义引发ReferenceError的变量。

// abc was never declared.
if (abc) {
    // ReferenceError: abc is not defined
} 

另一种情况是定义了变量,但有一个getter函数,在调用时抛出错误。例如

// 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?
}