如何在 JavaScript 中检查“未定义”?

2022-08-29 21:49:24

如果变量在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

如果您有兴趣知道变量是否尚未声明或是否具有值,请使用保证返回字符串的运算符:undefinedtypeof

if (typeof myVar !== 'undefined')

直接比较是麻烦的,因为可以覆盖。undefinedundefined

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

答案 2

我个人使用

myVar === undefined

警告:请注意,它已过度使用,并且之前已声明(未定义)。=====myVar


我不喜欢.我认为这是冗长和不必要的。(我可以在更少的代码中完成相同的操作。typeof myVar === "undefined"

现在,有些人读到这里时会痛苦地爬起来,尖叫着:“等等!哇!!! 可以重新定义!undefined

凉。我知道这一点。再说一遍,Javascript中的大多数变量都可以重新定义。是否应永远不要使用任何可以重新定义的内置标识符?

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

问题是,为了在JS中做很多实际的工作,开发人员需要依靠可重新定义的标识符来成为他们本来的样子。我没有听到人们告诉我,我不应该使用,因为有人可以setTimeout

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

底线,不使用原始的“它可以被重新定义”的论点是虚假的。=== undefined

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


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

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

但这两种技术都在其抽象中泄漏。我敦促你不要使用这个,甚至

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

考虑:

var iAmUndefined;

要了解该变量是否已声明,您可能需要求助于运算符。(在许多情况下,您可以简单地阅读代码O_o)。in

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

但是等等!还有更多!如果一些原型链魔法正在发生怎么办...?现在,即使是高级操作员也不够用。(好吧,我在这里完成了这部分,除了说在99%的时间内,(和****咳嗽****)工作得很好。如果你真的在乎,你可以自己阅读这个主题。in=== undefinedtypeof