如何检查在JavaScript中的“未定义”?
这个问题在这里已经有了答案:
如果您有兴趣了解变量是否已被声明而不管其值如何,那么使用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 5th ed。中进行了修补,并且undefined
是不可写的。
if (window.myVar)
也将包含这些falsy值,所以它不是很健壮:
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
类型强制转换。 (与null
不同, undefined
,也可以在ECMAScript 3环境中重新定义,使其不可靠用于比较,尽管几乎所有常见环境现在都符合ECMAScript 5或更高版本)。
if (typeof someUndeclaredVariable == "undefined") {
// Works
}
if (someUndeclaredVariable === undefined) {
// Throws an error
}
链接地址: http://www.djcxy.com/p/3261.html