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