JavaScript 中的相等判断
JavaScript 定义了 4 种不同的算法来判断两个值是否相等 :
- 抽象平等:
==
- 严格相等:
===
- 相同值:
Object.is()
- 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
不等于 -0
:Object.is(+0, -0) === false
。
SameValueZero: 没有办法直接使用 SameValueZero,但是 Array#includes()
方法 在内部使用 SameValueZero。 因此,要试用 SameValueZero,您可以使用 includes()
,SameValue 和 SameValueZero 之间的唯一区别是 SameValueZero 对待 +0
等于 -0
:[+0].includes(-0) === true
。
作为开发人员,您通常应该使用 ===
,如果您关心的话,您可能需要添加一个特殊案例 NaN
,之间的区别 +0
和 -0
对于大多数用例来说并不重要。
抽象平等
抽象平等有许多不同之处 。抽象相等算法支持多种 隐式类型转换 。 以下是简要概述:
- 如果
x
和y
是同一类型,检查是否x === y
。 - 如果
x
和y
两者都是null
或者undefined
, 返回true
。 - 如果
x
是一个数字并且y
是一个字符串,转换y
到一个数字,然后比较使用===
,同样,如果x
是布尔值或字符串,并且y
是一个数字,转换x
到一个数字。 - 如果
x
或者y
是一个布尔值,转换一个数字的另一个值并比较它们。 - 如果
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!
下面是使用这些不同的相等比较的地方:
- 严格平等:
indexOf()
,lastIndexOf
,case
报表 。 - 相同值零:
Set
价值观,Map
键 ,includes()
。 - SameValue: 内部使用
Object.defineProperty()
。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: JavaScript 中的 NaN
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论