硅基俊宁.
Skills · 技能体系 ↗
← 返回文章

ES 标准中相等比较算法 SameValue 和 SameValueZero

俊宁 · 2020-02-05
迁自历史博客,保留原文、署名、引用与原始日期;文中的版本、成果与性能结论不代表重新完成了当前验收。
查看原始出处 ↗ · 查看迁移清单
ES 标准中相等比较算法 SameValue 和 SameValueZero封面

JavaScript 对值的相等判断有很多不同的算法,== 只是最常用的一种。由于 NaN 和正负零的涉入,除了 == 和 === 之外还有 SameValue 和 SameValueZero 算法。

==、===、SameValue

=====SameValue(Object.is)
NaNNaN == NaN falseNaN === NaN falseObject.is(NaN, NaN) true
0、-00 == -0 true0 === -0 trueObject.is(0, -0) false

SameValueZero

但是你在使用es6中有没有疑惑这种情况:

const set = new Set()
set.add(0)
set.add(NaN)
set.has(-0) // true
set.has(NaN) // true

是不是与上述的三种算法的表现多不一样,这就是第四种比较算法 SameValueZero,它与 SameValue 的区别主要在于 0 与 -0 是否相等。

所以你在实践 includes 方法时,遇到:

const array = [0, NaN]
array.includes(-0) // true
array.includes(NaN) // true

就不用大惊小怪了,因为 includes 内部使用的比较算法就是SameValueZero。