我们经常在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语句的目的是在将值赋给变量之前检查null值或未定义值,则可以使用Nullish Coalescing Operator。根据caniuse的数据,大约85%的浏览器应该支持它(截至2021年1月)。该运算符的示例如下所示:

const a = some_variable ?? '';

这将确保如果some_variable为null或未定义,该变量将被分配给空字符串(或任何其他默认值)。

此操作符最适合您的用例,因为它不会为其他类型的假值(如0和”)返回默认值。

其他回答

使用严格比较运算符可以很容易地区分这两个值。

示例代码:

function compare(){
    var a = null; //variable assigned null value
    var b;  // undefined
    if (a === b){
        document.write("a and b have same datatype.");
    }
    else{
        document.write("a and b have different datatype.");
    }   
}

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

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

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

!!window['bleh'];

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

如果If语句的目的是在将值赋给变量之前检查null值或未定义值,则可以使用Nullish Coalescing Operator。根据caniuse的数据,大约85%的浏览器应该支持它(截至2021年1月)。该运算符的示例如下所示:

const a = some_variable ?? '';

这将确保如果some_variable为null或未定义,该变量将被分配给空字符串(或任何其他默认值)。

此操作符最适合您的用例,因为它不会为其他类型的假值(如0和”)返回默认值。

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

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