1、相等比拟算法
- The Abstract Equality Comparison Algorithm (==)
- The Strict Equality Comparison Algorithm (===)
- SameValue (Object.is())
- SameValueZero (暂未提供 API)
2、SameValue
对于前端研发来说,== 和 === 比拟算法必定曾经深刻理解了。
对于纯熟应用 ES6 的小伙伴,多晓得 Object.is() 这个办法:
Object.is(NaN, NaN) // true
Object.is(0, -0) // false
而 Object.is 外部采纳的比拟算法就是 SameValue(x, y),而它与 === 的区别也正是这两种状况。
3、SameValueZero
然而你在应用 es6 中有没有纳闷这种状况:
const s = new Set()
s.add(0)
s.add(NaN)
s.has(-0) // true
s.has(NaN) // true
是不是与上述的三种算法的体现多不一样,这就是第四种比拟算法 SameValueZero,它与 SameValue 的区别次要在于 0 与 - 0 是否相等。
所以你在实际 includes 办法时,遇到:
const a = [0, NaN]
a.includes(-0) // true
a.includes(NaN) // true
就不必少见多怪了,因为 includes 外部应用的比拟算法就是 SameValueZero。