咱们常常在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的一种(有害的)行为,仍是这两种方式之间确实存在一些区别? 函数
我认为测试“值是否为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 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;
因为没有一个完整而正确的答案,所以我将尝试总结一下:
一般,表达式为:
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)
您必须定义这种形式的功能:
validate = function(some_variable){ return(typeof(some_variable) != 'undefined' && some_variable != null) }
首先,您必须很是清楚要测试的内容。 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
。
如答案之一所述,若是您谈论的是具备全局做用域的变量,那么可能会很幸运。 如您所知,您全局定义的变量每每会添加到Windows对象中。 您能够利用这一事实,所以能够说您正在访问一个名为bleh的变量,只需使用double倒数运算符(!!)
!!window['bleh'];
当还没有声明bleh并为其分配值时,这将返回false。