JavaScript 中的相等判断

发布于 2023-01-28 16:08:44 字数 3432 浏览 127 评论 0

JavaScript 定义了 4 种不同的算法来判断两个值是否相等

  1. 抽象平等: ==
  2. 严格相等: ===
  3. 相同值: Object.is()
  4. SameValueZero:与 Object.is, 除了 -0 被认为等于 +0

严格相等、SameValueZero、SameValue

严格相等、SameValueZero 和 SameValue 几乎是等价的。 他们只是在处理 NaN, +0, 和 -0,对于所有其他值,最后 3 个算法是相同的。

严格平等: NaN 不严格等于任何值,甚至不等于它自己。 换句话说 NaN !== NaN(+0) === (-0)

SameValue: 相同值 Object.is() 函数实现 SameValue 算法。 使用 SameValue 算法, NaN 等于自身: Object.is(NaN, NaN) === true,但另一方面,+0 不等于 -0Object.is(+0, -0) === false

SameValueZero: 没有办法直接使用 SameValueZero,但是 Array#includes()方法 在内部使用 SameValueZero。 因此,要试用 SameValueZero,您可以使用 includes(),SameValue 和 SameValueZero 之间的唯一区别是 SameValueZero 对待 +0 等于 -0[+0].includes(-0) === true

作为开发人员,您通常应该使用 ===,如果您关心的话,您可能需要添加一个特殊案例 NaN,之间的区别 +0 和 -0 对于大多数用例来说并不重要。

抽象平等

抽象平等有许多不同之处 。抽象相等算法支持多种 隐式类型转换 。 以下是简要概述:

  1. 如果 xy是同一类型,检查是否 x === y
  2. 如果 xy两者都是 null或者 undefined, 返回 true
  3. 如果 x是一个数字并且 y是一个字符串,转换 y到一个数字,然后比较使用 ===,同样,如果 x是布尔值或字符串,并且 y是一个数字,转换 x到一个数字。
  4. 如果 x或者 y是一个布尔值,转换一个数字的另一个值并比较它们。
  5. 如果 x是一个对象并且 y是符号、字符串或数字,尝试转换 x 使用 valueOf() 到原语,然后使用比较 ===

通常,您不应该 使用 抽象相等性。 一个潜在的例外是检查 空值

// Only true if `v === null` or `v === undefined`
v == null;

// Equivalent:
v === null || v === undefined;

ESLint 有一条规则不允许 == 除非右侧为 null

使用这些相等比较的地方

这些不同相等比较的棘手部分是不同的 JavaScript 方法在内部使用不同的相等算法。 例如, Array#indexOf() 函数使用严格相等,但是 Array#includes() 使用 SameValueZero,这会在搜索时导致不同的行为 NaN 在数组中:

[NaN].indexOf(NaN); // -1, not found!

[NaN].includes(NaN); // true, found!

下面是使用这些不同的相等比较的地方:

  1. 严格平等: indexOf(), lastIndexOf, case 报表
  2. 相同值零: Set价值观, Mapincludes()
  3. SameValue: 内部使用 Object.defineProperty()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

望喜

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

已经忘了多久

文章 0 评论 0

15867725375

文章 0 评论 0

LonelySnow

文章 0 评论 0

走过海棠暮

文章 0 评论 0

轻许诺言

文章 0 评论 0

信馬由缰

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文