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

新手上路,请多包涵

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

原文由 Tomas Vana 发布,翻译遵循 CC BY-SA 3.0 许可协议

阅读 674
2 个回答

您必须区分不同的情况:

  1. 变量可以是 undefinedundeclared 。如果您在 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 属性不会产生错误,只会返回 undefined ,当转换为布尔值时,其计算结果为 false 。所以,如果你不在乎

0false ,使用 if(obj.undefProp) 是可以的。基于这个事实有一个常见的成语:

 value = obj.prop || defaultValue

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

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

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

原文由 user187291 发布,翻译遵循 CC BY-SA 4.0 许可协议

我认为测试“值是 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 检查 undefined 和 null 时。

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

编辑 2021-03:

现在 大多数浏览器都 支持 空值合并运算符( ??逻辑空值赋值 (??=) ,如果变量为空或未定义,它允许以更简洁的方式分配默认值,例如例子:

 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;

原文由 mar10 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题