Javascript 比较 == 空替代方案

Javascript comparisons == null alternatives

本文关键字:方案 比较 Javascript      更新时间:2023-09-26

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

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

对于 jshint 规则"eqeqeq",双等号失败,建议将双等号替换为三等号。让我们想象一下上面的代码从== 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
}

对我来说,这更简单,易于阅读,并且完全避免了明确的平等比较。但是,我不确定是否有任何边缘原因我在这里错过了?

所以问题是,我通常可以用否定的表达式 if 语句替换 == null 吗?如果是这样,它不起作用的陷阱和例外是什么?它是否适用于常规数组项、字符串、对象属性?

我选择解决方案的标准是

  • 干净的代码
  • 易于阅读和快速理解
  • 验证 JSint 规则
  • 适用于现代浏览器(截至 2015 年 1 月撰写)

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

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

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

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

对于所有错误值,!value检查都是正确的,而不仅仅是 nullundefined 。完整的列表是:nullundefined0""NaN,当然还有false

所以如果你有name = ""那么

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

。将评估 true 并进入块,您之前的

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

。不会。因此,只是在任何地方都这样做可能会带来问题。

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

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

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

函数调用的开销没有什么可远程担心的(更多),如果它位于热点中,任何像样的 JavaScript 引擎都会内联它。