2

在 JavaScript 代码中,我想替换以下 if 语句的双等号结构:

if( name == null ) {
  //do stuff
}

jshint 规则“eqeqeq”的双等号失败,建议将双等号替换为三等号。暂时,让我们想象一下上面的代码从== null变成=== null这样:

if( name === null ) {
  //do stuff
}

这适用于显式定义的具有 value 的变量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 月撰写)

我知道讨论相等运算符==vs===差异的其他稍微相关的问题,但这仅仅是为了讨论与 if 语句中的 null-ish 相比的评估。

4

1 回答 1

3

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

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

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

对于所有!value错误值,检查都将为真,而不仅仅是and 。完整列表是:、、、、,当然还有。nullundefinednullundefined0""NaNfalse

name = ""所以如果你有

if (!name) {
    // ...
}

...将评估为真并进入块,您以前的

if (name == null) {
    // ...
}

...不会。所以到处都这样做很可能会带来问题。

但是对于你知道你确实想要在任何虚假值上分支的情况,这!value件事非常方便。例如,如果一个变量是undefined(或null)或对象引用,我将使用它if (!obj)来测试它,因为任何虚假值对我来说都足够好。

如果你想继续使用 JSHint 的===规则,你可以给自己一个实用函数:

function isNullish(value) {
    return value === null || typeof value === "undefined";
}

函数调用的开销无需担心(更多),如果它在热点中,任何体面的 JavaScript 引擎都会内联它。

于 2015-01-31T09:31:30.480 回答