我们经常在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的一种(不必要的)行为,还是这两种方式之间真的有一些区别?


当前回答

正如在其中一个答案中提到的,如果您谈论的是一个具有全局作用域的变量,那么您可能会很幸运。您可能知道,全局定义的变量往往会被添加到windows对象中。你可以利用这一点假设你要访问一个名为bleh的变量,只需使用双倒操作符(!!)

!!window['bleh'];

这将返回一个false,而bleh还没有被声明和赋值。

其他回答

如果您试图引用一个未声明的变量,那么在所有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。

使用Ramda,你可以简单地执行R.isNil(yourValue) Lodash和其他辅助库具有相同的功能。

这是一个非常罕见的例子,建议使用==而不是===。表达式somevar == null对于undefined和null将返回true,但对于其他所有内容将返回false(如果变量未声明则会出现错误)。

如预期的那样,使用!=将翻转结果。

现代编辑器不会对使用==或!=操作符加null发出警告,因为这几乎总是需要的行为。

最常见的比较:

undeffinedVar == null     // true
obj.undefinedProp == null // true
null == null              // true
0 == null                 // false
'0' == null               // false
'' == null                // false

自己试试吧:

let undefinedVar;
console.table([
    { test : undefinedVar,     result: undefinedVar     == null },
    { test : {}.undefinedProp, result: {}.undefinedProp == null },
    { test : null,             result: null             == null },
    { test : false,            result: false            == null },
    { test : 0,                result: 0                == null },
    { test : '',               result: ''               == null },
    { test : '0',              result: '0'              == null },
]);

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

在ES5或ES6中,如果你需要多次检查,你可以这样做:

Const excluded = [null, undefined, "]; if (! exclude .includes(varToCheck) { //它将不是null,不是undefined,不是void字符串 }