如何在JavaScript中检查未定义或空变量?

How to check for an undefined or null variable in JavaScript?

提问人:Tomas Vana 提问时间:4/1/2010 最后编辑:Peter MortensenTomas Vana 更新时间:8/31/2023 访问量:921224

问:

我们经常在 JavaScript 代码中使用以下 Code Pattern

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

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

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

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

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

JavaScript null 未定义

评论

63赞 kennytm 4/1/2010
if(some_variable) { ... }如果 IS 或 OR ...some_variablefalse0
1赞 Tomas Vana 4/1/2010
好点;)但是假设我知道它不能是 false 或 0,我只想检查我是否可以在某些逻辑中使用它(作为字符串、数组等)
0赞 Jørn Schou-Rode 4/1/2010
相关新闻: stackoverflow.com/questions/27509/...
5赞 David Given 9/17/2015
...或空字符串。
0赞 T.Todua 12/4/2018
如何在 JavaScript 中检查空字符串的可能重复项?

答:

29赞 Andy E 4/1/2010 #1

如果尝试引用未声明的变量,则所有 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

评论

11赞 Andreas Köberle 8/31/2011
你会错过 NaN、0、“” 和 false,因为它们不是 null 也不是 undefined,而是 false。
0赞 thejoshwolfe 4/1/2013
@Andreas Köberle是对的。即使是非严格相等运算符也说 null 不同于 NaN、0、“” 和 false。你必须这样做才能获得等效的行为。if (myObj.some_property != null)
380赞 user187291 4/1/2010 #2

您必须区分以下情况:

  1. 变量可以是或未声明。如果您在除 以外的任何上下文中访问未声明的变量,则会出现错误。undefinedtypeof
if(typeof someUndeclaredVar == whatever) // works
if(someUndeclaredVar) // throws error

已声明但未初始化的变量为 。undefined

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

    value = obj.prop || defaultValue
    

    这意味着“如果具有属性,则将其分配给,否则分配默认值”。objpropvaluedefautValue

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

    value = ('prop' in obj) ? obj.prop : defaultValue
    

评论

2赞 Alsciende 4/1/2010
然后你可以谈谈 hasOwnProperty 和原型。[] 中的 'indexOf' !== [].hasOwnProperty('indexOf')
1赞 user187291 4/1/2010
是的,我考虑过添加这个,但为了简洁起见,我决定牺牲完整性。;)
79赞 Tomas 4/11/2013
您没有解决 0 和 false 的问题
13赞 Tgr 3/31/2015
你的意思是未声明的变量。可以声明变量,但其值仍为 。undefined
1赞 rism 11/28/2015
还要注意,它返回一个字符串。所以返回不是.typeofvar myVar; typeof(myVar)==undefinedfalsetrue
643赞 mar10 4/14/2013 #3

我认为测试“值是或”的最有效方法是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

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

检查可选参数:

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

检查现有对象的属性

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

另一方面可以处理未声明的全局变量(简单地返回)。然而,正如Alsciende所解释的那样,这些情况应该被减少到最低限度,这是有充分理由的。typeofundefined

注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 检查 undefined 和 null 时。

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

编辑 2021-03:

如今,大多数浏览器都支持 Nullish 合并运算 (??) 和逻辑 nullish 赋值 (??=),这允许更简洁的方式 如果变量为 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;

评论

2赞 Tomas 4/19/2013
非常重要的区别(顺便说一句,这个问题已经提到过)。这就是每个人都使用 typeof 的原因。对不起,但我不明白你的答案在哪里有用,你只是陈述了问题中所说的内容,而在前几行中,你甚至说错了。
44赞 mar10 4/20/2013
对不起,但我不得不不同意;-)恕我直言,使用是测试“null 或 undefined”(这是问题主题)的最有效方法。这并不少见(在 jQuery 1.9.1 中使用了 43 次),因为您经常知道变量已声明 - 或者您测试现有对象的属性,例如 .== nullif( o.foo == null)
5赞 Rannnn 7/29/2013
@mar10 (aUndefinedVar == null) 给出“aUndefinedVar is not defined”错误,不为 true。
1赞 mar10 7/29/2013
@Rannnn:这在“注 1”中讨论
11赞 Ian Lovejoy 4/4/2016
感谢您提供这个简洁的选项。在我 99% 的代码中,不需要区分 null 和 undefined,因此此检查的简洁性导致代码不那么混乱。
8赞 Tomas 12/29/2013 #4

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

通常,表达式:

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

无法简化,因为 可能是未声明的,因此省略 将导致 ReferenceError。但是,您可以根据上下文简化表达式variabletypeof(variable) != "undefined"

如果是全局的,则可以简化为:variable

if (window.variable != null)

如果它是局部变量,则可以避免未声明此变量的情况,并简化为:

if (variable != null)

如果是对象属性,则不必担心 ReferenceError:

if (obj.property != null)

评论

0赞 jww 3/2/2015
是 的一部分?当我们得到一个异常时,我们可以使用测试吗?navigatorwindownavigator is not definedwindow.navigator != null
0赞 ToolmakerSteve 10/27/2020
Re 如果它是局部的,则可以避免未声明此变量的情况。事实上,如果它是本地的,它就不能不声明——所以这不是问题。您的代码片段总是好的。[如果没有变量的本地声明,那么根据定义,它是对全局变量的引用,如果您认为它是本地变量,那么这可能是一个编程错误,因此导致运行时错误是一件好事。强化使用该较短代码片段的价值。
-1赞 ljofre 1/18/2014 #5

您必须定义以下形式的函数:

validate = function(some_variable){
    return(typeof(some_variable) != 'undefined' && some_variable != null)
}

评论

0赞 Chad 7/12/2016
如果未声明变量,这将生成相同的 ReferenceError。
18赞 Drew Noakes 2/27/2014 #6

首先,你必须非常清楚你测试的内容。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 == nullval != null

2赞 Farax 4/17/2014 #7

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

!!window['bleh'];

这将返回一个 false,而 bleh 尚未声明并分配一个值。

评论

0赞 ToolmakerSteve 10/27/2020
但是,对于任何值,它也会返回 false:该问题要求进行等效于 的测试。这个答案并不等同于此。falseytypeof(some_variable) != 'undefined' && some_variable != null
0赞 lucsorel 6/25/2014 #8

测试空性 () 或非空性 () 比测试变量的定义状态要少得多。if (value == null)if (value != null)

此外,如果变量(或对象属性)是用布尔值定义的,则测试(或)以确保变量(或对象属性)的存在会失败。Caveat emptor :)if (value)if( obj.property)false

88赞 Semra 1/4/2015 #9

检查具有正常相等性的 null 也将返回 true for undefined。

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

JS Equality

评论

4赞 Sharjeel Ahmed 3/11/2016
NaN 不等于 Nan?
6赞 Steven 4/14/2016
@monotheist NaN 不等于 NaN(参见 MDN 的 NaN 页面)。Javascript 使用 IEEE-754 作为其浮点,它指定了此行为。对此有一些想法,请参阅 stackoverflow.com/a/23666623/2563765
1赞 Thaina Yu 10/4/2019
@SharjeelAhmed 它是经过数学修正的。 从差分方程永远不能指望相等NaN
-2赞 Sohail Arif 6/24/2015 #10

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

示例代码:

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.");
    }   
}
33赞 Naren Yellavula 4/5/2016 #11

在较新的 JavaScript 标准(如 ES5 和 ES6)中,您可以这样说

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

all 返回 false,这类似于 Python 对空变量的检查。 因此,如果你想围绕一个变量编写条件逻辑,只需说

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

在这里,“null”或“空字符串”或“undefined”将被有效地处理。

评论

2赞 Himmators 7/8/2016
支持像IE5一样,为什么这不更广为人知!?
17赞 Andre Figueiredo 2/20/2018
OP 只是想测试不同的 和 ,其他虚假值应该返回 true!nullundefined
2赞 Eric Haynes 5/10/2018
它在条件中没有增加任何值。该条件的计算结果完全相同,并且仍然为 , 返回 false。当您想要捕获对象的真实性而不保留对该对象的引用时,您可以存储该对象而不是一些潜在的大型对象。仅供参考,这也等同于,第一个否定了真实性,第二个又否定了它。0NaN!!value!
3赞 Stephen P 7/13/2018
虽然从字面上看,使用关键字 undefined 是有效的,但尝试使用未定义的变量行不通的,这就是检查 null 或 undefined 的全部意义所在。This: 抛出一个 ReferenceError,指出“ReferenceError: undeclareVarName is not defined”Boolean(undefined)if (Boolean(undeclareVarName)) { console.log('yes'); } else { console.log('no'); }
1赞 ToolmakerSteve 10/27/2020
@NarenYellavula - 我不同意。该问题要求提供一个解决方案,该解决方案等效于他们显示的代码片段,用于测试 null 或 undefined。你的答案不等同于该测试。这传播了许多 JavaScript 程序员的坏习惯,并且可能会让刚刚学习 JavaScript 的人感到困惑。
4赞 DDave 6/9/2016 #12

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

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
}
3赞 Terry Lin 10/19/2017 #13

无论 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');
}

3赞 Akash Preet 2/28/2018 #14

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

Img1 Img2

2赞 Jameel Moideen 7/16/2018 #15

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

enter image description here

你可以看到所有的人都在转换为 false,这意味着这三个都假设 javascript “缺乏存在”。因此,您无需在代码中显式检查所有这三个,如下所示。

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

另外,我还想指出一件事。

Boolean(0) 的结果是什么?

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

12赞 Jason Watmore 1/29/2019 #16

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

[undefined, null].includes(value)

评论

1赞 Sébastien Temprado 2/5/2019
这是行不通的!ReferenceError:未定义值
2赞 arunmmanoharan 5/2/2019
它应该是要检查的值。
0赞 qräbnö 6/28/2020
只有在没有 typeof 的情况下才有效。除此之外,它又好又短。喜欢它。
0赞 ToolmakerSteve 10/27/2020
@qräbnö - 它相当于更短的.我可以看到的一个好处是,它不需要知道这一点,并且将 value 等于 的声明变量视为等于 。恕我直言,这还不足以成为使用这种不熟悉(且效率低下 - 每次都会创建一个数组)语法的理由。value != null== null!= nullundefinednull
0赞 qräbnö 10/28/2020
反正我喜欢它。您可以添加更多检查,例如空字符串。
1赞 Mab Kiani 3/27/2019 #17

我使用这种方法完成了此操作

将 ID 保存在某个变量中

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

然后使用 if 条件

if(someVariable === ""){
 //logic
} else if(someVariable !== ""){
 //logic
}
57赞 Yukulélé 4/5/2019 #18

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

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

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

评论

3赞 DKebler 4/15/2019
这个答案大约在 2019 年,缺乏赞成票,但它是这个用例的 KISS 答案。同样相反,只有一个,因为每个@Yukulele它是唯一使用的,当你看到它时,你就会知道它有什么作用。val != null===
0赞 Yukulélé 7/2/2020
@DKebler 我根据您的评论更改了我的答案。
2赞 Pramesh Bajracharya 10/20/2020
这个答案就像其中一个专业提示!
2赞 Adam Hughes 12/15/2020
哈,这就是为什么我的IDE只抱怨某些用途......哇,我讨厌javascript!==
4赞 gpap 5/14/2019 #19

与你所拥有的类似,你可以做类似的事情

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

评论

0赞 Max Waterman 6/30/2020
非常明显且易于维护的代码。希望有一个特定的运算符(除了“==”) - 类似于“??some_variable'(类似于 Nullish 合并运算符,将 'null' 和 'undefined' 分组为虚假,但认为 0 为真)。
1赞 vladernn 11/11/2019 #20

在 ES5 或 ES6 中,如果您需要多次检查它,您可以执行以下操作:

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

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

2赞 remjx 3/12/2020 #21

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

3赞 wentjun 4/14/2020 #22

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

const a = some_variable ?? '';

这将确保如果为 或 ,则变量将被分配给空字符串(或任何其他默认值)。some_variablenullundefined

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

5赞 Sabo 4/25/2020 #23

这是一个非常罕见的情况示例,建议使用代替 .表达式将返回 true for 和 ,但返回 false 对于其他所有内容(如果未声明变量,则出错)。=====somevar == nullundefinednull

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

现代编辑器不会警告使用 或运算符 ,因为这几乎总是所需的行为。==!=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 },
]);
0赞 Faheel Khan 9/3/2020 #24

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

 if ((Boolean(some_variable_1) && Boolean(some_variable_2)) === false) {
    // do something
    }
4赞 Elmer 10/3/2021 #25

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

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

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

这使用运算符 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator)。如果值为 是 或 ,则运算符将启动并将值 。??someObject.someMembernullundefined??null

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

评论

3赞 Matt 1/26/2022
我根本不清楚这一点。我不明白这个语法。你能解释一下吗?
0赞 Ryan Tirrell 6/26/2022
@matt它的简写。它基本上意味着如果 ??为 null 或未定义,则默认为??.后的值在这种情况下,如果 someObject.someMember 不保存值,则将为其分配 null 值。然后我们检查该值是否正好等于 null。如果是,那么我们进入代码块。
0赞 Zachiah 10/27/2022
我独立地想到了这个解决方案,但是您的解决方案有一个错误:由于运算符优先级,它实际上等价于 .您必须像这样将第一部分包装在括号中:.例如,您可以通过在控制台中运行来测试我所说的内容。请注意,它是if (someObject.someMember)if ((someObject.someMember ?? null) === null)false ?? null === nullfalse
0赞 Elmer 10/28/2022
你是对的!更新了示例
1赞 leonardosccd 6/6/2022 #26

let varToCheck = ""; //U have to define variable firstly ,or it throw error
const excluded = [null, undefined, ""];

if (!excluded.includes(varToCheck)) {
  // it will bee not null, not undefined and not void string
  console.log("pass");
} else {
  console.log("fail");
}

例如,我将 vladernn 的答案复制到测试中,您也可以单击“将片段复制到答案”按钮进行测试。

1赞 adityaatri 1/5/2023 #27

您可以使用库。lodash

_.isNil(value)为两者和truenullundefined

测试 - https://bazinga.tools/lodash

enter image description here

0赞 Asanka Siriwardena 4/4/2023 #28

您可以将以下内容与 nullish 合并一起使用

//if statement evaluates to true only for null and undefined falsy values, false for others)

const val = ''; 

if(typeof val !== typeof(val ?? 1)) {
    console.log('Matches only null or undefined');
}else {
    console.log('Any other value');
}

0赞 Abijith Ajayan 8/31/2023 #29

您可以检查此值是否存在。

if(value){
    // True Condition
}else{
// False Condition
}

如果 value 不是,则上面的代码将计算为 true:

  1. 定义
  2. 空字符串 (“”)
  3. 0