javascript
第九十六期:JavaScript 中的 4 个相等比较算法的介绍
JavaScript 運算中,一共包含 4 個相等比較算法:抽象相等比較;嚴格相等比較;SameValueZero;SameValue。
作者:zhangbao90s
JavaScript 運算中,一共包含 4 個相等比較算法:
- 抽象相等比較
- 嚴格相等比較
- SameValueZero
- SameValue
可以這么說,只要你做過相等比較,你就在使用四個算法中的一個。因為這些算法部署在了涉及到相等比較的操作符或方法中。
參見下表:
怎樣區分這些算法的不同呢,可以從兩方面切入:
下面給出一個總結:
就是說,抽象相等比較算法會發生類型轉換,SameValue 算法不會特殊對待 NaN、-0、+0 這些值。
類型轉換如何進行的?
上面討論的四種算法中,只有“抽象相等比較算法”會發生類型轉換。發生類型轉換的前提是:比較的兩個值類型不同,而且轉換結果是數值。
舉個例子:
?第一個比較為 true,好理解;第二個就不一樣了,會發生類型轉換——將非數字值轉為數字:'1' 跟 1 比較,兩者類型不同,'1' 是字符串,因此會先轉為數字——也就是 1(Number('1')),結果變為兩個 1 在一起比較,結果就是 true 了。
“抽象相等比較算法”還有一個比較怪癖的地方,在于規范中定義 null == undefined 返回結果為 true。按理說應該發生類型轉換,再進行比較的,比較結果應為 false(null 轉為 0,undefined 轉為 NaN,兩者不等)。
規范中對抽象相等比較算法搞了一個“小怪癖”:定義 null 和 undefined 的比較結果為 true
我猜想,這一定義可能是為了保證向前兼(tián)容(kēng),因此,我們記住即可。除此之外的其他情況,都按照類型轉換后的比較結果為準。
NaN、-0 和 +0 是如何被特殊處理的?
ES2015 標準出版之前,是沒有 SameValueZero 和 SameValue 這兩個算法的。也就是說只有抽象相等比較和嚴格相等比較這兩個算法:這兩個算法有點問題——就是不能區分 NaN 以及 +0 和 -0。因此在 ES2015 之前,我們會遭遇這樣的比較結果:
?NaN 與自身不相等,+0 等于 -0。在意識中,我們可能接受不了“NaN 與自身不相等”的結果,但是能夠理解“+0 等于 -0”(都是 0 嘛),但是在某些符號位具有含義的場景中——- 表示向左,+ 表示向右,那么區分 +0 等于 -0 就有意義了。
基于此,ES2015 中引入了 SameValue 算法,Object.is() 方法內部就是使用此算法,比較兩個值是否相等。
SameValueZero 算法,通過名稱我們可能就猜到,與 SameValue 算法的區別,僅僅是對“零”的態度上——SameValueZero 算法不能區分 +0 和 -0。
就是說:
array.includes(0) 的結果沒有返回 false,是因為其內部使用的 SameValueZero 算法不能區分 +0 和 -0。
閱讀目錄(置頂)(長期更新計算機領域知識)
閱讀目錄(置頂)(長期更新計算機領域知識)
閱讀目錄(置頂)(長期科技領域知識)
歌謠帶你看java面試題
總結
以上是生活随笔為你收集整理的第九十六期:JavaScript 中的 4 个相等比较算法的介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: anaconda在windows和mac
- 下一篇: Spring常用的的注解对应xml配置详