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。