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

IT技术 javascript null undefined
2021-02-03 16:39:20

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

6个回答

我认为测试“值是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

正如问题中提到的,short 变体需要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 检查 undefined 和 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;
抱歉,但我不同意 ;-)== null直言,使用是测试“null 或 undefined”(这是问题主题)的最有效方法。这绝不是罕见的(在 jQuery 1.9.1 中使用了 43 次),因为您经常知道变量已声明 - 或者您测试现有对象的属性,例如if( o.foo == null).
2021-03-17 16:39:20
非常重要的区别(顺便说一句,这已经在问题中提到了)。这就是为什么每个人都使用 typeof。抱歉,我不明白您的答案在哪里有用,您只需说明问题中所说的内容,并且在前几行中甚至错误地说明了它。
2021-03-26 16:39:20
@mar10 (aUndefinedVar == null) 给你一个“aUndefinedVar is not defined”错误不正确。
2021-03-31 16:39:20
感谢您提供这个简洁的选项。在我的 99% 的代码中,不需要区分 null 和 undefined,因此这种检查的简洁性会减少代码的混乱。
2021-04-03 16:39:20
@Rannnn:这在“注释 1”中讨论过
2021-04-08 16:39:20

您必须区分情况:

  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所以,如果你不关心 0false,使用if(obj.undefProp)是可以的。有一个基于这个事实的常见习语:

    value = obj.prop || defaultValue
    

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

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

    value = ('prop' in obj) ? obj.prop : defaultValue
    
你没有解决 0 和 false 的问题
2021-03-12 16:39:20
然后你可以谈论 hasOwnProperty 和原型。[] 中的 'indexOf' !== [].hasOwnProperty('indexOf')
2021-03-14 16:39:20
你的意思是未声明的变量。一个变量可以被声明,但仍然有一个值undefined
2021-03-22 16:39:20
还要注意typeof返回一个字符串。所以var myVar; typeof(myVar)==undefined返回falsetrue
2021-03-25 16:39:20
是的,我考虑过添加这个,但决定为了简洁而牺牲完整性。;)
2021-04-02 16:39:20

用正常的相等性检查 null 也会为 undefined 返回 true。

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

JS 平等

@SharjeelAhmed 它已在数学上更正。NaN从差分方程永远不能期望相等
2021-03-14 16:39:20
NaN 不等于 Nan?
2021-03-20 16:39:20
@monotheist NaN 不等于 NaN(参见MDN 的 NaN 页)。Javascript 使用 IEEE-754 作为其指定此行为的浮点数。对此有一些想法,请参阅stackoverflow.com/a/23666623/2563765
2021-03-20 16:39:20

这是在其中的唯一的情况下,==!=应使用:

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

这个答案就像那些专业提示之一!
2021-03-12 16:39:20
这个答案大约在 2019 年有一个缺乏赞成票,但它是这个用例的 KISS 一个。同样val != null相反,只有一个= ,因为根据@Yukulele,它是唯一一个可以使用的==,当您看到它时,您就会知道它的作用。
2021-03-19 16:39:20
@DKebler 我根据你的评论改变了我的答案。
2021-03-28 16:39:20
哈哈 所以这就是为什么我的 IDE 只抱怨某些用途==......哇,我讨厌 javascript!
2021-04-09 16:39:20

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

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

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

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

这里“null”或“空字符串”或“未定义”将被有效处理。

虽然从字面上使用关键字不确定Boolean(undefined)作品,试图与一个不确定的变量 工作,那就是做对null或undefined检查整点。这:if (Boolean(undeclareVarName)) { console.log('yes'); } else { console.log('no'); }抛出一个 ReferenceError 说“ReferenceError: undeclareVarName is not defined”
2021-03-13 16:39:20
OP 只是想测试不同的nulland undefined,其他假值应该返回真!
2021-03-26 16:39:20
它在条件中不增加任何value。条件的计算结果完全相同,对于0,仍然返回 false NaN这是为了当您想在不保留对对象的引用的情况下捕获对象的真实性时,以便您可以存储该对象而不是一些潜在的大对象。仅供参考,这也等价于!!value,第一个!否定真实性,第二个再次否定它。
2021-03-28 16:39:20
> 仅供参考,这也相当于 !!value,第一个 ! 否定真实性。 哪个仅供参考也相当于if (var)哪个将被强制转换为布尔值,所以基本上完​​全没用......
2021-04-04 16:39:20
支持下来就喜欢ie5了,为什么这个不太出名!?
2021-04-10 16:39:20