首页 > 解决方案 > 在 JavaScript 中,使用 `a == null` 实际上等同于 `a === null || 一个 === 未定义`?

问题描述

我花了一段时间才注意到始终===在 JavaScript 中使用而不是==.

但是今天我注意到

if (a == null) { ... }

似乎与

if (a === null || a === undefined) { ... }

来自 MDN 文档中的表格

我希望知道:

  1. 它们真的相同吗?
  2. 是否建议使用表格a == null而不是a === null || a === undefined

标签: javascriptcomparison-operators

解决方案


是的,它们是相同的,除了一个情况document.all(请参阅第一条评论)。==我们可以在图表中看到,null并且仅与自身和彼此undefined进行比较: is 、and is等,仅此而已。所以当我们使用 时,唯一能给出 a 的是and :truenull == nulltruenull == undefinedtruesomething == nullsomethingtruenullundefined

在此处输入图像描述

甚至 TC39 也是这样使用它的:

https://github.com/tc39/proposal-optional-chaining/blob/master/README.md

a?.b                          // undefined if `a` is null/undefined, `a.b` otherwise.
a == null ? undefined : a.b

但是,我不建议在日常编码中使用它。这是因为,如果代码a == null被其他程序员阅读,他们可能会立即将其更改为a === null,如果测试用例无法捕捉到它,那么系统中可能会引入一个微妙的错误。

在一个开源项目中,您可以最终决定什么进入和什么不进入,然后可以在您的代码审查和批准的情况下使用它。或者,如果您使用它一次或两次,然后在上面加上适当的评论来说明您要做什么。

否则,大多数其他程序员可能会认为您是否真的打算只比较null而不考虑undefined. 如果你写a === null || a === undefined,那么大多数人都知道你在做什么。

第三个副作用是,如果您说a == null与 相同a === null || a === undefined,您可能会在 Stack Overflow 上吸引大量用户,对您投反对票,说永远不要==在 JavaScript 中使用。

一个有趣的事实是,甚至 Babel 也翻译a?.b为与nullundefined( void 0) 进行比较,而不仅仅是使用== null. Babel 并不是必须的,但也许它这样做是为了让程序员在阅读编译后的代码时更清楚。

但是我不知道有多少面试官问过我线路if (a == null)好不好,当我说我们应该使用时===,我被视为比新手高出一步,因为所有“专业人士”都知道这a == null是为了检查是否anullundefined。因此,虽然在代码中实际使用它可能并不好,但它对于测试某人是否是专业人士是有好处的。


推荐阅读