我认为最有效的测试“值为空或未定义”的方法是
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可以处理未声明的全局变量(只是返回未定义)。然而,正如Alsciende解释的那样,出于充分的理由,这些病例应该减少到最低限度。
注2
这个更短的变体是不等价的:
if ( !some_variable ) {
// some_variable is either null, undefined, 0, NaN, false, or an empty string
}
so
if ( some_variable ) {
// we don't get here if some_variable is null, undefined, 0, NaN, false, or ""
}
注3
一般情况下,建议使用===代替==。
建议的解决方案是这条规则的一个例外。为此,JSHint语法检查器甚至提供了eqnull选项。
jQuery风格指南:
严格的相等性检查(===)应该用于==。唯一的
异常是在检查undefined和null时通过null的方式。
// Check for both undefined and null values, for some important reason.
undefOrNull == null;
2021 - 03年编辑:
现在大多数浏览器
支持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;