在JavaScript代码中,我想替换以下if语句的双等于结构:
if( name == null ) {
//do stuff
}
对于jshint规则" eqeqeq",double等于失败,建议用double equals替换double equals。暂时,让我们想象上面的代码从== null
更改为=== null
,如下所示:
if( name === null ) {
//do stuff
}
这适用于显式定义的值为null
的变量,但不幸的是,对于任何未设置的变量都会失败。
var a = null; // works correctly
var b; // will fail in comparison
以前,当三重平等规则对我很重要时,我会做以下
if( name === null ||| typeof(name) === 'undefined' )
但我发现这非常臃肿。
我现在能想出的最好的选择是使用if语句的本质,并让它评估为像这里的假表达式,在这里我否定表达式并简单地删除== null
部分:
if( !name ) {
//do stuff
}
对我来说,这更简单,易于阅读,完全避免明确的等于比较。但是,我不确定是否有任何边缘原因我错过了吗?
所以问题是,我是否可以将== null
替换为否定表达式if语句?如果是这样,那么它不会起作用的陷阱和例外是什么?它适用于一般数组项,字符串,对象属性吗?
我选择解决方案的标准是
我知道有关讨论difference in the equality operators ==
vs ===
的其他一些稍微相关的问题,但这仅仅是为了讨论与if语句中的null-ish相比的评估。
答案 0 :(得分:3)
所以问题是,我通常可以用if语句的否定表达式替换== null吗?
可能不是普遍,不,但也许在某些地方。
如果是这样,那些不起作用的陷阱和例外是什么?它适用于一般数组项,字符串,对象属性吗?
!value
检查对于所有的假名值都是如此,而不只是null
和undefined
。完整列表包括:null
,undefined
,0
,""
,NaN
,当然还有false
。
所以如果你有name = ""
那么
if (!name) {
// ...
}
...将评估为true并进入前一个
的块if (name == null) {
// ...
}
......不会。所以到处都是这样可能会带来问题。
但是对于你知道你想要分支任何虚假值的情况,!value
事情非常方便。例如,如果变量是undefined
(或null
)或对象引用,我将使用if (!obj)
进行测试,因为任何虚假值对我来说都足够好那里。
如果你想继续使用JSHint的===
规则,你可以给自己一个实用功能:
function isNullish(value) {
return value === null || typeof value === "undefined";
}
函数调用的开销并不是远程担心(more),任何体面的JavaScript引擎无论如何都会在热点中内联它。