聊一聊相等運算與 SameValue

  • 2019 年 12 月 4 日
  • 筆記

本文作者:IMWeb etoileli 原文出處:IMWeb社區 未經同意,禁止轉載

變量的運算是日常開發中必須且頻繁接觸的內容。

其中 相等運算符 可算是使用頻率最高的運算符。

除了直接使用之外,我們平常使用的過濾、映射、排序等等,當然都會進行值的比較。

類型轉換

有一定基礎的開發中都知道,

JavaScript 中使用相等運算符,會進行類型轉換,

舉個例子:

'1' == 1 // true  true == 1 // true

類型轉換,在開發上,有時候會帶給我們一些便利。

例如少寫幾句代碼:)

但類型轉換也會隱藏陷阱,就像下面的例子:

'0' == 0 // true  !!'0' == 0 // false

假設字符串 0 跟 數字 0 均使用變量,

就會寫出非常不直觀,不符合直覺的代碼:

a == b // true  !!a == b // false

當然,如果我們使用了 === 全等運算符,就可以避免掉坑啦。

所以,在日常工作中,要多使用 === 哦。

SameValue 與 SameValueZero

SameValueSameValueZero 會被成對提及的內容。

這兩個玩意是用來做什麼的呢?

SameValueSameValueZero 其實是 ecma 中,比較值是否相等的算法,具體參考如下:

SameValuehttp://ecma-international.org/ecma-262/6.0/#sec-samevalue

SameValueZerohttp://ecma-international.org/ecma-262/6.0/#sec-samevaluezero

SameValueSameValueZero 是為了解決什麼問題的嗯?

舉個例子,我們都知道 NaN 的定義是與任何其他值均不相等。

因此,就會有以下結果:

NaN == NaN // false  NaN === NaN // false

有的時候,我們還是希望可以判斷 NaN ,因此就誕生了 SameValue

SameValue(NaN, NaN); // true

SameValue 就像字面意思 Same Value ~

所以,對於 +0-0 則會認為是不同的值:

+0 == -0 // true  +0 === -0 // true  SameValue(+0, -0); // false

以上兩種情況,就是 SameValue=== 不同的地方。(判斷 NaN,+0,-0 時)

那麼還有,SameValueZero

使用 SameValueZero 的話,對於 +0-0 則會認為是同一個值:

+0 == -0 // true  +0 === -0 // true  SameValue(+0, -0); // false  SameValueZero(+0, -0); // true

所以, SameValueZero=== 只有一個不是的情況。(判斷 NaN 時)

lodash

我們經常使用的 lodash,也有大量使用 SameValueZero,有興趣的同學,可以都了解一下~

以上就是關於相等運算與 SameValue的內容,謝謝。