【问题标题】:Javascript comparisons == null alternativesJavascript 比较 == null 替代品
【发布时间】:2015-01-31 09:25:52
【问题描述】:

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

我选择解决方案的标准是

  • 干净的代码
  • 易读易懂
  • 验证 jshint 规则
  • 适用于现代浏览器(截至 2015 年 1 月撰写)

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

【问题讨论】:

  • === 规则被大大高估了,我可能会直接关掉它。
  • 我喜欢=== 规则还有一个原因:字符串比较。相反,我认为最奇怪的是javascript最初同时引入了=====。这会导致错误等待发生。

标签: javascript jshint triple-equals


【解决方案1】:

所以问题是,我通常可以用否定表达式 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 引擎都会在热点中内联它。

【讨论】:

  • 感谢您的见解。我之前介绍了isNullish,但发现即使行为符合预期,我也可以处理更简单的方法(鉴于您指出的限制)
猜你喜欢
  • 2011-03-05
  • 2012-04-08
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多