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

这个问题在这里已经有了答案:

  • 检测未定义的对象属性40个答案
  • 如何在JavaScript中检查未定义的变量11个答案
  • 如何在javascript中处理'undefined'[复制] 3个答案
  • 如何检查一个变量是否存在于JavaScript中? 8个答案

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

    上一篇: How to check for "undefined" in JavaScript?

    下一篇: Why use === instead of == when comparing a String