在 JavaScript 中,技术上有 4 种不同的方法来比较 2 个值是否相等 。 最常见的两种方式是 == 和 === 运算符 ,也称为 抽象相等比较 和 严格相等比较 。
严格等式 ===
给定 2 个值 x 和 y,下面是 JavaScript 检查是否 x === y:
- 检查类型
x和y,如果它们是不同的类型,则返回false。 - 如果
x和y是数字,首先检查是否有x或者y是NaN,并返回false如果一个是NaN,如果两者x和y要么是+0或者-0, 返回true。 否则,检查它们是否是相同的数字。 - 如果
x和y都是null或两者undefined, 返回true。 - 如果
x和y都是布尔值、字符串或符号,按值比较它们。 - 如果
x和y都是对象,当且仅当它们引用同一个对象时才返回 true。
简而言之,这里是重要的细节 ===:
- 没有隐式类型强制。
===不会调用valueOf()方法或做任何其他事情来尝试将对象转换为基元。 - 没有价值
=== NaN,你不应该使用===检查NaN,而是应该使用Number.isNaN()。 - 对象比较是 通过引用 ——两个不同的对象可以包含完全相同的键,但是
===还是会说他们不一样。
const obj1 = { answer: 42 };
const obj2 = { answer: 42 };
obj1 === obj2; // false
抽象相等 ==
== 运算符使用更复杂的 抽象相等比较 算法来比较是否 x 和 y是平等的。 以下是简要概述:
- 如果
x和y是同一类型,检查是否x === y. - 如果
x和y两者都是null或者undefined, 返回true. - 如果
x是一个数字并且y是一个字符串, 转换y到一个数字 ,然后使用比较===. 同样,如果x是一个布尔值或字符串,并且y是一个数字,转换x到一个号码。 - 如果
x或者y是一个布尔值,转换一个数字的另一个值并比较它们。 - 如果
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 开发人员,您可以选择这样做,但始终使用 ===。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END








请登录后查看评论内容