我们经常在JavaScript代码中使用以下代码模式

if (typeof(some_variable) != 'undefined' && some_variable != null)
{
    // Do something with some_variable
}

是否有一种不那么冗长的检查方法具有相同的效果?

根据一些论坛和文献,简单地说下面应该有同样的效果。

if (some_variable)
{
    // Do something with some_variable
}

不幸的是,当some_variable未定义时,Firebug在运行时将这样的语句计算为错误,而第一个语句对它来说很好。这仅仅是Firebug的一种(不必要的)行为,还是这两种方式之间真的有一些区别?


当前回答

由于没有一个完整而正确的答案,我将尝试总结:

一般来说,表达式为:

if (typeof(variable) != "undefined" && variable != null)

不能简化,因为变量可能没有声明,因此省略typeof(variable) != "undefined"将导致ReferenceError。但是,你可以根据上下文来简化表达式:

如果变量是全局的,你可以简化为:

if (window.variable != null)

如果它是局部的,你可以避免这个变量未声明的情况,也可以简化为:

if (variable != null)

如果它是object属性,你不必担心ReferenceError:

if (obj.property != null)

其他回答

let varToCheck = "";//你必须先定义变量,否则会抛出错误 Const excluded = [null, undefined, ""]; if (!excluded.includes(varToCheck)) { //它将不是null,不是undefined,不是void字符串 console.log(“通过”); }其他{ console.log(“失败”); }

例如,我复制vladernn的答案来测试,你也可以点击按钮“复制片段来回答”来测试。

在浏览器中打开开发人员工具,并尝试如下图所示的代码。

如果您试图引用一个未声明的变量,那么在所有JavaScript实现中都会抛出一个错误。

对象的属性不受相同条件的约束。如果未定义对象属性,则在尝试访问它时不会抛出错误。在这种情况下,你可以缩短:

 if (typeof(myObj.some_property) != "undefined" && myObj.some_property != null)

to

if (myObj.some_property != null)

考虑到这一点,以及全局变量可以作为全局对象(浏览器中的窗口)的属性访问的事实,你可以对全局变量使用以下方法:

if (window.some_variable != null) {
    // Do something with some_variable
}

在局部作用域中,确保变量在代码块的顶部声明总是有用的,这将节省重复使用typeof。

由于没有一个完整而正确的答案,我将尝试总结:

一般来说,表达式为:

if (typeof(variable) != "undefined" && variable != null)

不能简化,因为变量可能没有声明,因此省略typeof(variable) != "undefined"将导致ReferenceError。但是,你可以根据上下文来简化表达式:

如果变量是全局的,你可以简化为:

if (window.variable != null)

如果它是局部的,你可以避免这个变量未声明的情况,也可以简化为:

if (variable != null)

如果它是object属性,你不必担心ReferenceError:

if (obj.property != null)

与ES5和ES6标准比较undefined或null或0的最佳方法

 if ((Boolean(some_variable_1) && Boolean(some_variable_2)) === false) {
    // do something
    }