ES6標準中的相等比較算法 SameValue、SameValueZero

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。

幾個比較規範
SameValueNonNumber
這個規範規定比較的值 x 和 y 都不爲 Number 類型,照抄規範如下:

(1)x 的類型不爲 Number 類型
(2)y 的類型與 x 的類型一致
(3)如果 x 的類型爲 Undefined ,返回 true
(4)如果 x 的類型爲 Null ,返回 true
(5)如果 x 的類型爲 String,並且 x 和 y 的長度及編碼相同,返回 true,否則返回 false
(6)如果 x 的類型爲 Boolean ,並且 x 和 y 同爲 true 或同爲false ,返回 true,否則返回 false
(7)如果 x 的類型爲 Symbol ,並且 x 和 y 具有相同的 Symbol 值,返回 true,否則返回 false
(8)如果 x 和 y 指向同一個對象,返回 true, 否則返回 false
Strict Equality Comparison
js 中的全等(===)便是遵循這個規範,照搬規範如下:

(1)如果 x 和 y 的類型不同,返回 false
(2)如果 x 的爲 Number 類型:
a. 如果 x 爲 NaN ,返回 false
b. 如果 y 爲 NaN ,返回 false
c. 如果 x 和 y 的數值一致,返回 true
d. 如果 x 爲 +0 並且 y 爲 -0 ,返回 true
e. 如果 x 爲 -0 並且 y 爲 +0 ,返回 true
f. 返回 false
(3)按照 SameValueNonNumber 的結果返回
SameValue
規範如下:

(1)如果 x 和 y 的類型不同,返回 false
(2)如果 x 的類型爲 Number
a. 如果 x 爲 NaN 並且 y 爲 NaN ,返回 true
b. 如果 x 爲 +0 並且 y 爲 -0 ,返回 false
c. 如果 x 爲 -0 並且 y 爲 +0 , 返回 false
d. 如果 x 和 y 的數值一致,返回 true
e. 返回 false
(3)按照 SameValueNonNumber 的結果返回
SameValueZero
這個是 eq 遵循的規範,如下:

(1)如果 x 和 y 的類型不同,返回 false
(2)如果 x 的類型爲 Number
a. 如果 x 爲 NaN 並且 y 爲 NaN ,返回 true
b. 如果 x 爲 +0 並且 y 爲 -0 ,返回 true
c. 如果 x 爲 -0 並且 y 爲 +0 , 返回 true
d. 如果 x 和 y 的數值一致,返回 true
e. 返回 false
(3)按照 SameValueNonNumber 的結果返回
小結:SameValueNonNumber 是基本,Strict Equality Comparison 、SameValue 和 SameValueZero 只是在對待 +0、-0 和 NaN 上有區別。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章