在 JavaScript 中,技术上有 4 种不同的方法来比较 2 个值是否相等 。 最常见的两种方式是 == 和 === 运算符 ,也称为 抽象相等比较 和 严格相等比较

严格等式 ===

给定 2 个值 xy,下面是 JavaScript 检查是否 x === y

  1. 检查类型 xy,如果它们是不同的类型,则返回 false
  2. 如果 xy是数字,首先检查是否有 x 或者 yNaN,并返回 false 如果一个是 NaN,如果两者 xy 要么是 +0 或者 -0, 返回 true。 否则,检查它们是否是相同的数字。
  3. 如果 xy 都是 null 或两者 undefined, 返回 true
  4. 如果 xy 都是布尔值、字符串或符号,按值比较它们。
  5. 如果 xy 都是对象,当且仅当它们引用同一个对象时才返回 true。

简而言之,这里是重要的细节 ===

  1. 没有隐式类型强制。 === 不会调用 valueOf() 方法或做任何其他事情来尝试将对象转换为基元。
  2. 没有价值 === NaN,你不应该使用 === 检查 NaN,而是应该使用 Number.isNaN()
  3. 对象比较是 通过引用 ——两个不同的对象可以包含完全相同的键,但是 === 还是会说他们不一样。
const obj1 = { answer: 42 };
const obj2 = { answer: 42 };

obj1 === obj2; // false

抽象相等 ==

== 运算符使用更复杂的 抽象相等比较 算法来比较是否 xy是平等的。 以下是简要概述:

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

抽象相等比较是 奇怪边缘情况 JavaScript 著名的

     == 0; // true
     == false; // true
({ valueOf: () => 42 }) == 42; // true
({ valueOf: () => 0 }) == false; // true

通常,您应该始终使用 === 而不是 == 除非你确定你知道你在做什么。 有一个简洁的功能用途 ==:检查 null 或者 undefined(所谓的 空值 )只需一次检查:

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

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

检查是否 v == null 是一种更简洁的检查方法 v 严格等于 null 或者 undefined,如果您是更高级的 JavaScript 开发人员,您可以选择这样做,但始终使用 ===

ESLint 有一个规则不允许 == 除非 右手边是 null

© 版权声明
评论 抢沙发

请登录后发表评论