在 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
请登录后查看评论内容