我们经常在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 some_variable这样的语句评估为运行时错误,而第一个语句就可以了。 这仅仅是Firebug的一种(有害的)行为,还是这两种方式之间确实存在一些区别?
#1楼
我认为测试“值是否为null或undefined ”的最有效方法是
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
通常,建议使用===代替== 。 提议的解决方案是该规则的例外。 为此, eqnull 语法检查器甚至提供了eqnull选项。
应该使用严格的相等性检查(===)来支持==。 唯一的例外是通过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。 但是, 您可以根据上下文简化表达式 :
如果variable是global ,则可以简化为:
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具有各种隐式转换,可带您进入旅途,还有两种不同类型的相等比较器: ==和=== 。
测试null或undefined的函数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。