我们经常在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在运行时将这样的语句计算为错误,而第一个语句对它来说很好。这仅仅是Firebug的一种(不必要的)行为,还是这两种方式之间真的有一些区别?
由于没有一个完整而正确的答案,我将尝试总结:
一般来说,表达式为:
if (typeof(variable) != "undefined" && variable != null)
不能简化,因为变量可能没有声明,因此省略typeof(variable) != "undefined"将导致ReferenceError。但是,你可以根据上下文来简化表达式:
如果变量是全局的,你可以简化为:
if (window.variable != null)
如果它是局部的,你可以避免这个变量未声明的情况,也可以简化为:
if (variable != null)
如果它是object属性,你不必担心ReferenceError:
if (obj.property != null)
由于没有一个完整而正确的答案,我将尝试总结:
一般来说,表达式为:
if (typeof(variable) != "undefined" && variable != null)
不能简化,因为变量可能没有声明,因此省略typeof(variable) != "undefined"将导致ReferenceError。但是,你可以根据上下文来简化表达式:
如果变量是全局的,你可以简化为:
if (window.variable != null)
如果它是局部的,你可以避免这个变量未声明的情况,也可以简化为:
if (variable != null)
如果它是object属性,你不必担心ReferenceError:
if (obj.property != null)
这也是一种很好的(但很啰嗦)方法:
if((someObject.someMember ?? null) === null) {
// bladiebla
}
正在发生的事情非常清楚,很难被误解。这是非常重要的!: -)
这个使用??运营商(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator)。如果someObject的值。somember为空或未定义,则??运算符介入并将值置为空。
TBH,我喜欢这个东西的明确性,但我通常更喜欢someObject。somember == null,它更有可读性,熟练的JS开发人员可能知道这里发生了什么。