JavaScript中Object.is()与===比较:精准处理NaN和-0的同值相等新方法

AI 概述
JavaScript中严格相等“===”虽规定值与类型均相等且不进行类型转换,在多数场景表现出色,但处理NaN和正负零时存在问题:NaN不等于自身,正负零被视为相等。为解决这些问题,ES引入新API Object.is(),它被定义为同值相等,在多数情况下与“===”结果相同,但能正确处理NaN(认为NaN等于NaN)和正负零(可区分+0和-0)。Object.is()是“===”的补充,提供更精确的相等性定义,建议默认用“===”,特殊场景用Object.is()。
目录
文章目录隐藏
  1. 严格相等 ===
  2. 更精确的同值相等

JavaScript 中 Object.is()与===比较:精准处理 NaN 和-0 的同值相等新方法

“用 ===,别用 ==!” 然而,即使是看似完美的 ===,在某些极端场景下也会暴露出它的问题。

现在,是时候了解一个新的成员了,它并非要彻底取代 ===,而是为了填补其留下的空白,让“相等”这个概念在 JavaScript 中变得更加精确和符合直觉。

严格相等 ===

=== 规定:不仅值要相等,类型也必须相同,它从不进行类型转换。

'1' === 1;        // false,类型不同(string vs number)
true === 1;       // false,类型不同(boolean vs number)
null === undefined; // false,类型不同

在 99% 的场景下,=== 都表现得非常出色,它清晰、可靠、符合预期。然而,它在处理两个 JavaScript 中的“特殊公民”时,却显得有些力不从心。

=== 的两个问题

1.NaN 的自我否定

NaN 是一个非常特殊的值,它代表一个“非数字”的结果,根据 IEEE 754 标准,NaN 不等于任何值,包括它自己。

NaN === NaN; // false

这在数学上是合理的,但在编程中却很麻烦。比如,我们想在一个数组中查找 NaN,indexOf 或 includes 方法(在 ES6 之前)会因为这个特性而失效。

2.被抹平的正负零

在 JavaScript 中,数字 0 有两种表示:+0 (或 0) 和 -0。它们在数学运算和某些底层应用(如图形学)中具有不同的意义。然而,=== 认为它们是完全相等的。

-0 === +0; // true

对于绝大多数应用来说,这并无大碍,但对于需要高精度数学计算的场景,这种模糊处理可能会导致问题。

更精确的同值相等

为了解决 === 的这两个问题,ES 为我们引入了一个新的 API:Object.is(),它被定义为同值相等。

Object.is() 的行为逻辑可以简单概括为:

在绝大多数情况下,Object.is(a, b) 的结果与 a === b 相同。唯一的区别在于它如何处理 NaN 和 -0

让我们看看 Object.is() 是如何完美解决上述问题的:

1.NaN 等于 NaN

Object.is() 认为 NaN 和 NaN 是相等的。

Object.is(NaN, NaN); // true

这使得检查一个值是否为 NaN 变得更加直观(尽管我们仍然有 Number.isNaN() 这个更专业的工具)。

2.区分 +0 和 -0

Object.is() 能够清晰地分辨出正零和负零。

Object.is(-0, +0); // false
Object.is(0, -0);  // false
Object.is(0, 0);   // true

目前,JavaScript 内部的许多新特性已经在使用 Object.is() 的“同值相等”逻辑了,比如 Map 的键匹配和 Set 的值存储。

Object.is() 并不是 === 的替代品,而是一个强大的补充,它提供了一种在 JavaScript 中更严格精确的相等性定义。

我们的开发实践可以这样总结:默认使用 ===:它快速、可靠,并且能处理绝大多数情况;在需要处理 NaN 或 -0 的特殊场景下,使用 Object.is()。

以上关于JavaScript中Object.is()与===比较:精准处理NaN和-0的同值相等新方法的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

2

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » JavaScript中Object.is()与===比较:精准处理NaN和-0的同值相等新方法

发表回复