我认为测试“价值是或”的最有效方法是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
检查可选参数:
function(foo){
if( foo == null ) {...}
检查现有对象的属性
if(my_obj.foo == null) {...}
另一方面可以处理未声明的全局变量(简单地返回)。然而,正如Alsciende所解释的那样,出于充分的理由,这些案件应该减少到最低限度。typeof
undefined
附注 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 检查未定义和 null 时。
// Check for both undefined and null values, for some important reason.
undefOrNull == null;
编辑2021-03:
如今,大多数浏览器都支持 Nullish 合并运算符 (??
) 和 Logical nullish 赋值 (??=)
,它允许在变量为 null 或未定义时以更简洁的方式分配默认值,例如:
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;