javascript - 在 JavaScript 中,使用 `a == null` 实际上等同于 `a === null || 一个 === 未定义`?
问题描述
我花了一段时间才注意到始终===
在 JavaScript 中使用而不是==
.
但是今天我注意到
if (a == null) { ... }
似乎与
if (a === null || a === undefined) { ... }
我希望知道:
- 它们真的相同吗?
- 是否建议使用表格
a == null
而不是a === null || a === undefined
?
解决方案
是的,它们是相同的,除了一个情况document.all
(请参阅第一条评论)。==
我们可以在图表中看到,null
并且仅与自身和彼此undefined
进行比较: is 、and is等,仅此而已。所以当我们使用 时,唯一能给出 a 的是and :true
null == null
true
null == undefined
true
something == null
something
true
null
undefined
甚至 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
为与null
和undefined
( void 0
) 进行比较,而不仅仅是使用== null
. Babel 并不是必须的,但也许它这样做是为了让程序员在阅读编译后的代码时更清楚。
但是我不知道有多少面试官问过我线路if (a == null)
好不好,当我说我们应该使用时===
,我被视为比新手高出一步,因为所有“专业人士”都知道这a == null
是为了检查是否a
是null
或undefined
。因此,虽然在代码中实际使用它可能并不好,但它对于测试某人是否是专业人士是有好处的。
推荐阅读
- asp.net-core - 在 EF Core 3.1 中只有一个 DbContext 是不好的做法吗?
- ios - 是否有 Unity 2019-Social.localUser.id 获取旧版 gamecenterPlayerId?
- sql - 将 ASCII 表中的所有字符插入一个字段
- javascript - mapFn 在 map(mapFn, thisArg) 中代表什么?
- sql - 为什么我无法删除 postgres 数据库
- sapui5 - 绑定模型更改时 VizFrame 不更新
- json - 缺少字段的 JSON 结构 - 需要建议 - 这是一种好习惯吗?
- ios - SwiftUI:使用 .position() 时对齐前沿
- javascript - Scrapy xpath 不提取包含特殊字符的 div <%=
- shopify - 具有代理扩展 PUT 请求的 Shopify 应用程序不起作用