Javascript比较== null替代品

时间:2015-01-31 09:25:52

标签: javascript jshint triple-equals

在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语句?如果是这样,那么它不会起作用的陷阱和例外是什么?它适用于一般数组项,字符串,对象属性吗?

我选择解决方案的标准是

  • 清洁代码
  • 易于阅读和快速理解
  • 验证jshint规则
  • 适用于现代浏览器(截至2015年1月)

我知道有关讨论difference in the equality operators == vs ===的其他一些稍微相关的问题,但这仅仅是为了讨论与if语句中的null-ish相比的评估。

1 个答案:

答案 0 :(得分:3)

  

所以问题是,我通常可以用if语句的否定表达式替换== null吗?

可能不是普遍,不,但也许在某些地方。

  

如果是这样,那些不起作用的陷阱和例外是什么?它适用于一般数组项,字符串,对象属性吗?

!value检查对于所有的假名值都是如此,而不只是nullundefined。完整列表包括:nullundefined0""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引擎无论如何都会在热点中内联它。