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

咱们常常在JavaScript代码中使用如下代码模式 浏览器

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

有没有更冗长的检查方法具备相同的效果? 安全

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

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

不幸的是,当未定义some_variable时, Firebug some_variable这样的语句评估为运行时错误,而第一个语句就能够了。 这仅仅是Firebug的一种(有害的)行为,仍是这两种方式之间确实存在一些区别? 函数


#1楼

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

正如问题中提到的那样,简短变体要求声明了some_variable ,不然将引起ReferenceError。 可是,在许多用例中,您能够假定这是安全的: code

检查可选参数: 对象

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

检查现有对象的属性 ip

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

一般,建议使用===代替== 。 提议的解决方案是该规则的例外。 为此, eqnull 语法检查器甚至提供了eqnull选项。

jQuery样式指南

应该使用严格的相等性检查(===)来支持==。 惟一的例外是经过null检查undefined和null时。

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

#2楼

因为没有一个完整而正确的答案,所以我将尝试总结一下:

一般,表达式为:

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

没法简化,由于可能未声明该variable所以省略typeof(variable) != "undefined"将致使ReferenceError。 可是, 您能够根据上下文简化表达式

若是variableglobal ,则能够简化为:

if (window.variable != null)

若是它是local ,则能够避免未声明此变量的状况,而且还能够简化为:

if (variable != null)

若是它是object property ,则没必要担忧ReferenceError:

if (obj.property != null)

#3楼

您必须定义这种形式的功能:

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

#4楼

首先,您必须很是清楚要测试的内容。 JavaScript具备各类隐式转换,可带您进入旅途,还有两种不一样类型的相等比较器: =====

测试nullundefined的函数test(val)应该具备如下特征:

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


#5楼

如答案之一所述,若是您谈论的是具备全局做用域的变量,那么可能会很幸运。 如您所知,您全局定义的变量每每会添加到Windows对象中。 您能够利用这一事实,所以能够说您正在访问一个名为bleh的变量,只需使用double倒数运算符(!!)

!!window['bleh'];

当还没有声明bleh并为其分配值时,这将返回false。

相关文章
相关标签/搜索