协慌网

登录 贡献 社区

如何在 JavaScript 中检查 “undefined”?

在 JavaScript 中测试变量是否未定义的最合适方法是什么?我见过几种可能的方法:

if (window.myVariable)

要么

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

要么

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

答案

如果您想知道变量是否已被声明而不管其值如何,那么使用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')

typeof运算符保证返回一个字符串。直接比较undefined是很麻烦的,因为undefined可以被覆盖。

window.undefined = "omg";
"omg" == 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?
}

我个人用

myVar === undefined

警告:请注意, ===使用了==myVar先前已声明 (没有定义 )。


我不喜欢typeof myVar === "undefined" 。我认为这是漫长的啰嗦和不必要的。 (我可以用更少的代码完成相同的工作。)

现在有些人在读到这篇文章时会苦苦挣扎,尖叫道:“等等!WAAITTT !!! undefined可以重新定义!”

凉。我知道这个。然后,Javascript 中的大多数变量都可以重新定义。您是否应该使用任何可以重新定义的内置标识符?

如果你遵循这条规则,对你有好处:你不是伪君子。

问题是,为了在 JS 中进行大量实际工作,开发人员需要依赖可重定义的标识符来实现它们的本质。我没有听到有人告诉我我不应该使用setTimeout因为有人可以

window.setTimeout = function () {
    alert("Got you now!");
};

最重要的是,“它可以重新定义” 参数不使用原始=== undefined是假的。

(如果你仍然害怕undefined被重新定义,为什么你盲目地将未经测试的库代码集成到你的代码库中?或者甚至更简单:一个 linting 工具。)


此外,与typeof方法一样,此技术可以 “检测” 未声明的变量:

if (window.someVar === undefined) {
    doSomething();
}

但这两种技术都在它们的抽象中泄漏。我劝你不要使用这个甚至是

if (typeof myVar !== "undefined") {
    doSomething();
}

考虑:

var iAmUndefined;

要捕获是否声明了该变量,您可能需要求助于in运算符。 (在许多情况下,您只需阅读代码 O_o)。

if ("myVar" in window) {
    doSomething();
}

可是等等!还有更多!如果一些原型链魔术正在发生怎么办?现在,即使是上级in运营商是不够的。 (好吧,我在这里完成了这个部分,除了说 99%的时间, === undefined (和 **** 咳嗽 **** typeof )工作正常。如果你真的在乎,你可以自己阅读这个主题。)

使用typeof是我的偏好。从未声明变量时它将起作用,与使用=====运算符进行比较或使用if强制类型不同。 ( undefined ,与null不同,也可能在 ECMAScript 3 环境中重新定义,使其不可靠进行比较,尽管现在几乎所有常见环境都符合 ECMAScript 5 或更高版本)。

if (typeof someUndeclaredVariable == "undefined") {
    // Works
}

if (someUndeclaredVariable === undefined) { 
    // Throws an error
}