溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JavaScript中的4 個相等比較算法的簡單介紹

發(fā)布時間:2021-09-17 07:51:26 來源:億速云 閱讀:134 作者:chen 欄目:web開發(fā)

這篇文章主要講解了“JavaScript中的4 個相等比較算法的簡單介紹”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“JavaScript中的4 個相等比較算法的簡單介紹”吧!

JavaScript 運(yùn)算中,一共包含 4 個相等比較算法:

  • 抽象相等比較

  • 嚴(yán)格相等比較

  • SameValueZero

  • SameValue

可以這么說,只要你做過相等比較,你就在使用四個算法中的一個。因為這些算法部署在了涉及到相等比較的操作符或方法中。

參見下表:

JavaScript中的4 個相等比較算法的簡單介紹

怎樣區(qū)分這些算法的不同呢,可以從兩方面切入:

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. 是否會發(fā)生類型轉(zhuǎn)換

  3. 對 NaN、-0、+0(即 0) 這些值是否存在特殊處理

下面給出一個總結(jié):

JavaScript中的4 個相等比較算法的簡單介紹

就是說,抽象相等比較算法會發(fā)生類型轉(zhuǎn)換,SameValue 算法不會特殊對待 NaN、-0、+0 這些值。

類型轉(zhuǎn)換如何進(jìn)行的?

上面討論的四種算法中,只有“抽象相等比較算法”會發(fā)生類型轉(zhuǎn)換。發(fā)生類型轉(zhuǎn)換的前提是:比較的兩個值類型不同,而且轉(zhuǎn)換結(jié)果是數(shù)值。

舉個例子:

1 == 1 // true(未發(fā)生類型轉(zhuǎn)換) '1' == 1 // true(發(fā)生了類型轉(zhuǎn)換)

第一個比較為 true,好理解;第二個就不一樣了,會發(fā)生類型轉(zhuǎn)換——將非數(shù)字值轉(zhuǎn)為數(shù)字:'1' 跟 1 比較,兩者類型不同,'1'  是字符串,因此會先轉(zhuǎn)為數(shù)字——也就是 1(Number('1')),結(jié)果變?yōu)閮蓚€ 1 在一起比較,結(jié)果就是 true 了。

“抽象相等比較算法”還有一個比較怪癖的地方,在于規(guī)范中定義 null == undefined 返回結(jié)果為  true。按理說應(yīng)該發(fā)生類型轉(zhuǎn)換,再進(jìn)行比較的,比較結(jié)果應(yīng)為 false(null 轉(zhuǎn)為 0,undefined 轉(zhuǎn)為 NaN,兩者不等)。

JavaScript中的4 個相等比較算法的簡單介紹

規(guī)范中對抽象相等比較算法搞了一個“小怪癖”:定義 null 和 undefined 的比較結(jié)果為 true

我猜想,這一定義可能是為了保證向前兼(tián)容(kēng),因此,我們記住即可。除此之外的其他情況,都按照類型轉(zhuǎn)換后的比較結(jié)果為準(zhǔn)。

NaN、-0 和 +0 是如何被特殊處理的?

ES2015 標(biāo)準(zhǔn)出版之前,是沒有 SameValueZero 和 SameValue  這兩個算法的。也就是說只有抽象相等比較和嚴(yán)格相等比較這兩個算法:這兩個算法有點問題——就是不能區(qū)分 NaN 以及 +0 和 -0。因此在 ES2015  之前,我們會遭遇這樣的比較結(jié)果:

NaN === NaN // false +0 === -0 // true [NaN].indexOf(NaN) // -1 [0].indexOf(-0) // -1

NaN 與自身不相等,+0 等于 -0。在意識中,我們可能接受不了“NaN 與自身不相等”的結(jié)果,但是能夠理解“+0 等于 -0”(都是 0  嘛),但是在某些符號位具有含義的場景中——- 表示向左,+ 表示向右,那么區(qū)分 +0 等于 -0 就有意義了。

基于此,ES2015 中引入了 SameValue 算法,Object.is() 方法內(nèi)部就是使用此算法,比較兩個值是否相等。

Object.is(NaN, NaN) // true Object.is(0, -0) // false

SameValueZero 算法,通過名稱我們可能就猜到,與 SameValue 算法的區(qū)別,僅僅是對“零”的態(tài)度上——SameValueZero  算法不能區(qū)分 +0 和 -0。

就是說:

var array = [NaN, -0] array.includes(NaN) // true array.includes(0) // true

array.includes(0) 的結(jié)果沒有返回 false,是因為其內(nèi)部使用的 SameValueZero 算法不能區(qū)分 +0 和 -0。

感謝各位的閱讀,以上就是“JavaScript中的4 個相等比較算法的簡單介紹”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對JavaScript中的4 個相等比較算法的簡單介紹這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI