583

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

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

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

根据一些论坛和文献的说法,简单地说以下应该具有相同的效果。

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

不幸的是,当未定义时,Firebug在运行时将这样的语句评估为错误some_variable,而第一个语句就可以了。这只是 Firebug 的一种(不需要的)行为,还是这两种方式之间真的有一些区别?

4

25 回答 25

548

我认为测试“价值是nullundefined”的最有效方法是

if ( some_variable == null ){
  // some_variable is either null or undefined
}

所以这两行是等价的:

if ( typeof(some_variable) !== "undefined" && some_variable !== null ) {}
if ( some_variable != null ) {}

注1

如问题中所述,短变体要求some_variable已声明,否则将引发ReferenceError。但是,在许多用例中,您可以假设这是安全的:

检查可选参数:

function(foo){
    if( foo == null ) {...}

检查现有对象的属性

if(my_obj.foo == null) {...}

另一方面typeof可以处理未声明的全局变量(简单地返回undefined)。然而,正如 Alsciende 解释的那样,出于充分的理由,这些案例应该减少到最低限度。

笔记2

这个 - 甚至更短 - 变体是等价的:

if ( !some_variable ) {
  // some_variable is either null, undefined, 0, NaN, false, or an empty string
}

所以

if ( some_variable ) {
  // we don't get here if some_variable is null, undefined, 0, NaN, false, or ""
}

注3

一般来说,建议使用===而不是==. 建议的解决方案是该规则的一个例外。JSHint语法检查器甚至eqnull为此提供了选项。

来自jQuery 风格指南

应该使用严格的相等检查 (===) 来支持 ==。唯一的例外是在通过 null 检查未定义和 null 时。

// Check for both undefined and null values, for some important reason. 
undefOrNull == null;

编辑 2021-03:

现在大多数浏览器都 支持Nullish 合并运算符 ( ??)Logical nullish assignment(??=),如果变量为 null 或未定义,则可以更简洁地分配默认值,例如:

if (a.speed == null) {
  // Set default if null or undefined
  a.speed = 42;
}

可以写成这些形式中的任何一种

a.speed ??= 42;
a.speed ?? a.speed = 42;
a.speed = a.speed ?? 42;
于 2013-04-13T19:44:16.463 回答
373

您必须区分不同的情况:

  1. 变量可以是undefined或未声明的。如果您在除typeof.
if(typeof someUndeclaredVar == whatever) // works
if(someUndeclaredVar) // throws error

已声明但未初始化的变量是undefined.

let foo;
if (foo) //evaluates to false because foo === undefined
  1. 未定义的属性,例如someExistingObj.someUndefProperty. 未定义的属性不会产生错误,只会返回undefined,当转换为布尔值时,其计算结果为false。所以,如果你不关心 0and false,使用if(obj.undefProp)是可以的。基于这个事实有一个常见的成语:

    value = obj.prop || defaultValue
    

    这意味着“如果obj有属性prop,则将其分配给value,否则分配默认值defautValue”。

    有些人认为这种行为令人困惑,认为它会导致难以发现的错误,并建议改用in运算符

    value = ('prop' in obj) ? obj.prop : defaultValue
    
于 2010-04-01T09:54:29.213 回答
83

用正常相等检查 null 也将为未定义返回 true。

if (window.variable == null) alert('variable is null or undefined');

JS 平等

于 2015-01-03T17:44:28.023 回答
34

这是唯一应该使用==并且!=应该使用的情况:

if (val == null) console.log('val is null or undefined')
if (val != null) console.log('val is neither null nor undefined')

对于任何其他比较,应使用严格的比较器 (===和)。!==

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness

于 2019-04-05T15:47:20.727 回答
31

在 ES5 和 ES6 等较新的 JavaScript 标准中,你可以说

> Boolean(0) //false
> Boolean(null)  //false
> Boolean(undefined) //false

all return false,类似于 Python 对空变量的检查。因此,如果您想围绕变量编写条件逻辑,只需说

if (Boolean(myvar)){
   // Do something
}

这里“null”或“empty string”或“undefined”将得到有效处理。

于 2016-04-05T07:10:06.787 回答
24

如果你尝试引用一个未声明的变量,所有的 JavaScript 实现都会抛出一个错误。

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

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

if (myObj.some_property != null)

考虑到这一点,以及全局变量可以作为全局对象的属性访问的事实(window在浏览器的情况下),您可以将以下内容用于全局变量:

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

在本地范围内,确保在代码块的顶部声明变量总是有用的,这将节省typeof.

于 2010-04-01T09:23:49.377 回答
18

首先,您必须非常清楚您测试的内容。JavaScript 有各种各样的隐式转换来绊倒你,还有两种不同类型的相等比较器:=====.

test(val)测试nullundefined应具有以下特征的功能:

 test(null)         => true
 test(undefined)    => true
 test(0)            => false
 test(1)            => false
 test(true)         => false
 test(false)        => false
 test('s')          => false
 test([])           => false

让我们看看这里的哪些想法实际上通过了我们的测试。

这些工作:

val == null
val === null || val === undefined
typeof(val) == 'undefined' || val == null
typeof(val) === 'undefined' || val === null

这些不起作用:

typeof(val) === 'undefined'
!!val

我创建了一个jsperf 条目来比较这些方法的正确性和性能。结果暂时还没有定论,因为在不同的浏览器/平台上运行的次数还不够。请花一点时间在您的计算机上运行测试!

目前看来,简单的val == null测试表现最好。它也几乎是最短的。val != null如果您想要补码,测试可能会被否定。

于 2014-02-27T12:48:22.450 回答
11

这是使用 Array includes()方法的另一种方法:

[undefined, null].includes(value)
于 2019-01-29T02:10:33.857 回答
8

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

一般来说,表达式:

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

不能简化,因为variable可能未声明,所以省略typeof(variable) != "undefined"会导致 ReferenceError。但是,您可以根据上下文简化表达式

如果variableglobal,您可以简化为:

if (window.variable != null)

如果它是local,您可能可以避免未声明此变量的情况,并且还可以简化为:

if (variable != null)

如果是对象属性,就不用担心ReferenceError:

if (obj.property != null)
于 2013-12-28T19:44:30.663 回答
5

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

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

现代编辑器不会警告使用==!=运算符 with 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 },
]);
于 2020-04-25T12:22:55.807 回答
4

您可以检查变量是否有值。意义,

if( myVariable ) {
//mayVariable is not :
//null
//undefined
//NaN
//empty string ("")
//0
//false

}

如果你不知道一个变量是否存在(也就是说,如果它被声明了)你应该检查 typeof 操作符。例如

if( typeof myVariable !== 'undefined' ) {
    // myVariable will get resolved and it is defined
}
于 2016-06-09T04:32:02.120 回答
4

与您所拥有的类似,您可以执行类似的操作

if (some_variable === undefined || some_variable === null) { do stuff }

于 2019-05-14T09:32:50.477 回答
3

无论yyy是 undefined 还是 null,它都会返回 true

if (typeof yyy == 'undefined' || !yyy) {
    console.log('yes');
} else {
    console.log('no');
}

是的

if (!(typeof yyy == 'undefined' || !yyy)) {
    console.log('yes');
} else {
    console.log('no');
}

于 2017-10-19T08:31:17.220 回答
3

在浏览器中打开开发人员工具,然后尝试下图中显示的代码。

图1 图2

于 2018-02-27T18:01:33.300 回答
3

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

const a = some_variable ?? '';

some_variable如果isnull或,这将确保将变量分配给空字符串(或任何其他默认值)undefined

此运算符最适合您的用例,因为它不会返回其他类型的假值的默认值,例如0and ''

于 2020-04-13T18:59:26.927 回答
2

如其中一个答案所述,如果您谈论的是具有全局范围的变量,那么您可能会很幸运。您可能知道,您在全局范围内定义的变量往往会添加到 windows 对象中。您可以利用这一事实,假设您正在访问一个名为 bleh 的变量,只需使用双反转运算符 (!!)

!!window['bleh'];

当 bleh 没有被声明并赋值时,这将返回一个 false。

于 2014-04-17T01:27:47.997 回答
2

为了理解,我们来分析一下 Javascript 引擎在转换 undefined 、 null 和 ''(也是空字符串)时返回的值是什么。你可以直接在你的开发者控制台上检查。

在此处输入图像描述

您可以看到所有都转换为 false ,这意味着所有这三个都假设 javascript '不存在'。因此,您无需像下面那样显式检查代码中的所有三个。

if (a === undefined || a === null || a==='') {
    console.log("Nothing");
} else {
    console.log("Something");
}

另外我想指出一件事。

Boolean(0) 的结果是什么?

当然是假的。当 0 是您预期结果中的有效值时,这将在您的代码中创建一个错误。因此,请确保在编写代码时检查这一点。

于 2018-07-16T03:04:32.997 回答
1

我已经使用这种方法做到了这一点

将 id 保存在某个变量中

var someVariable = document.getElementById("someId");

然后使用 if 条件

if(someVariable === ""){
 //logic
} else if(someVariable !== ""){
 //logic
}
于 2019-03-27T11:46:32.297 回答
1

这也是一种很好的(但冗长的)方式:

if(someObject.someMember ?? null === null) {
  // bladiebla
}

发生的事情非常清楚,而且很难被误解。这可能非常重要!:-)

这使用??运算符(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator)。如果 的值为someObject.someMembernullundefined??操作员介入并生成该值null

TBH,我喜欢这个东西的明确性,但我通常更喜欢someObject.someMember == null它,它更具可读性和熟练的 JS 开发人员可能知道这里发生了什么。

于 2021-10-03T07:09:48.220 回答
0

测试空值 ( if (value == null)) 或非空值 ( if (value != null)) 比测试变量的定义状态更简洁。

此外,如果使用布尔值定义变量(或对象属性) ,则测试if (value)(或 )以确保其存在会失败。买者自负 :)if( obj.property)false

于 2014-06-25T09:03:13.993 回答
0

使用严格比较运算符可以轻松区分这两个值:

工作示例:

http://www.thesstech.com/tryme?filename=nullandundefined

示例代码:

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.");
    }   
}
于 2015-06-23T21:31:45.453 回答
0

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

const excluded = [null, undefined, ''];

if (!exluded.includes(varToCheck) {
  // it will bee not null, not undefined and not void string
}

于 2019-11-11T08:38:24.337 回答
0

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

于 2020-03-11T21:38:16.073 回答
0

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

 if ((Boolean(some_variable_1) && Boolean(some_variable_2)) === false) {
    // do something
    }
于 2020-09-03T10:00:53.353 回答
-1

您必须定义这种形式的函数:

validate = function(some_variable){
    return(typeof(some_variable) != 'undefined' && some_variable != null)
}
于 2014-01-17T18:12:56.313 回答