【发布时间】:2013-05-16 09:09:57
【问题描述】:
我遇到了以下代码:
function test(data) {
if (data != null && data !== undefined) {
// some code here
}
}
我对 JavaScript 有点陌生,但是,从我在这里阅读的其他问题来看,我的印象是这段代码没有多大意义。
特别是,this answer 指出
如果您在除typeof之外的任何上下文中访问未定义变量,您将收到错误消息。
更新:上面的答案(引用)可能具有误导性。它应该说«一个未声明的变量»,而不是«一个未定义的变量»。
我发现,在Ryan ♦、maerics 和nwellnhof 的答案中,即使没有为函数提供参数,它的参数变量也总是被声明。这个事实也证明了下面列表中的第一项是错误的。
据我了解,可能会遇到以下几种情况:
函数在没有参数的情况下被调用,因此使data成为未定义的变量,并在data != null上引发错误。-
该函数是专门用
李>null(或undefined)作为其参数调用的,在这种情况下data != null已经保护了内部代码,使&& data !== undefined无用。 使用非空参数调用函数,在这种情况下,它会轻松传递
data != null和data !== undefined。
问:我的理解正确吗?
我在 Firefox 的控制台中尝试了以下操作:
--
[15:31:31.057] false != null
[15:31:31.061] true
--
[15:31:37.985] false !== undefined
[15:31:37.989] true
--
[15:32:59.934] null != null
[15:32:59.937] false
--
[15:33:05.221] undefined != null
[15:33:05.225] false
--
[15:35:12.231] "" != null
[15:35:12.235] true
--
[15:35:19.214] "" !== undefined
[15:35:19.218] true
我不知道data !== undefined after data != null 有什么用处。
【问题讨论】:
-
只需使用
if (data)。这是检查data变量是否为真的 Javascript 助记方法。undefined、null、false、0、空字符串、空数组和 (?) 没有属性的对象评估为 false,其余为 true。 -
@J0HN - 使用
if(data)意味着他不能将false或0作为data的值传递。 -
@J0HN 另外,我提到的相同答案还指出:
if(typeof someUndefVar == whatever) -- works和if(someUnderVar) -- error。 -
应该是
data !== null && data !== undefined,相当于data != null,相当于data != undefined。前一种形式往往受到青睐,因为它对条件更明确,而很容易忽略null和undefined都在与后两种条件进行检查。 -
顺便说一下,
undefined的显式测试是 IMO 代码异味。它不是像null这样的受保护关键字,它是一个碰巧未定义的变量。这是完全有效的,并且会破坏您的代码:undefined = 1
标签: javascript null undefined null-check