JavaScript相等判斷的避坑實(shí)戰(zhàn)指南
JS中的相等性
1、嚴(yán)格相等(===)
嚴(yán)格相等本質(zhì)上是判斷一個(gè)值是否與自身相等,在比較前不進(jìn)行隱式類型轉(zhuǎn)換。當(dāng)被比較的兩個(gè)值類型相同,值也相同,且不是Number類型時(shí),這兩個(gè)值是全等的。當(dāng)兩個(gè)值類型是Number時(shí),我們需要注意NaN,NaN和NaN不相等,+0和-0全等,其余情況,只要值相等,就是全等的。
NaN === NaN //false +0 === -0 // true undefined === undefined //true null === null //true undefined === null //false ({}) === {} //false 3 === '3' //false 3 === 3 //true true === true //true false === 0 //false
2、非嚴(yán)格相等(抽象相等)(==)
判斷比較的兩個(gè)值是否相等,在比較前會(huì)轉(zhuǎn)化為相同的類型,轉(zhuǎn)換類型后,和嚴(yán)格相等(===)比較規(guī)則一致。
比較規(guī)則(A/B) | undefined | null | Number | String | Boolean | Object |
---|---|---|---|---|---|---|
undefined | true | true | false | false | false | false |
null | true | true | false | false | false | false |
Number | false | false | A === B | toNumber(B)===A | toNumber(B)===A | toPrimetive(B) == A |
String | false | false | toNumber(A)===B | A===B | toNumber(A)===toNumber(B) | toPrimetive(B) == A |
Boolean | false | false | toNumber(A)===B | toNumber(A)===toNumber(B) | A===B | toPrimetive(B) == toNumber(A) |
Object | false | false | toPrimitive(A) == B | toPrimitive(A) == B | toPrimetive(A) == toNumber(B) | A===B |
null == undefined // true null == 0 // false null == '' // false null == 'null' //false null == false // false null == [] //false null == {} //false null == NaN //false undefined == 0 //false undefined == '' //false undefined == 'undefined' //false undefined == false //false undefined == [] //false undefined == {} //false undefined == NaN //false '' == 0 //true '' == false //true '' == [] //true '' == {} // false 0 == false // true 0 == [] // true 0 == {} // false true == '1' //true true == 'true' //false true == 1 // true true == [] //false false == [] //true true == {} //false ([]) == [] //false ({}) == {} //false 3 == '3' //true NaN == NaN // false +0 == -0 // true
總結(jié)規(guī)律可得: undefined和null認(rèn)為值相等,但是當(dāng)undefined和null與其他類型進(jìn)行相等比較時(shí),不進(jìn)行隱式類型轉(zhuǎn)換,與其他的任何類型值都不相等,所有對(duì)象與undefined和null不相等,但是有個(gè)特例,如:document.all == undefined
和document.all == null
均為true
嚴(yán)格相等和非嚴(yán)格相等比較可得:嚴(yán)格相等的結(jié)果更具預(yù)測(cè)性,且無(wú)需進(jìn)行類型轉(zhuǎn)換,效率也更高
3、同值相等
同值相等是用來(lái)判斷兩個(gè)值是否是同一個(gè)值,通過(guò)Object.is()
來(lái)判斷,是es6新方法。有點(diǎn)類似于嚴(yán)格相等,不會(huì)對(duì)傳入的兩個(gè)參數(shù)值進(jìn)行隱式類型轉(zhuǎn)換,但是與嚴(yán)格相等又不完全相同,在對(duì)待+0、-0以及NaN上不一致
- 都是undefined
- 都是null
- 相同的兩個(gè)字符串
- 都是true或者都是false
- 引用值相同的兩個(gè)對(duì)象
- 都是NaN
- 都是不為NaN且不為0的值相同的數(shù)字
- 都是+0或者都是-0
Object.is(NaN, NaN) //true Object.is(NaN, 0 / 0) // true Object.is(+0, -0) // false Object.is(+0, +0) //true Object.is(undefined, undefined) //true Object.is(null, null) //true Object.is(undefined, null) //false Object.is({}, {}) //false Object.is(3, '3') //false Object.is(3, 3) //true Object.is(true, true) //false Object.is(false, 0) //false
4、零值相等
**與同值相等類似,認(rèn)為+0和-0相等**
Object.is()實(shí)現(xiàn)方案
// 實(shí)現(xiàn)方案: Object.defineProperty(Object, "is", { value: function (x, y) { if (x === y) { // 需要區(qū)分一下+0和-0 return x !== 0 || 1 / x === 1 / y } else { // 需要區(qū)分一下NaN return x !== x && y !== y } } })
總結(jié)
到此這篇關(guān)于JavaScript相等判斷避坑的文章就介紹到這了,更多相關(guān)JavaScript相等判斷避坑內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript注冊(cè)監(jiān)聽(tīng)事件和清除監(jiān)聽(tīng)事件方式詳解
js中事件監(jiān)聽(tīng)就是利用addEventListener來(lái)綁定一個(gè)事件,這個(gè)用法在jquery中非常常用并且簡(jiǎn)單,但在原生js中比較復(fù)雜,下面這篇文章主要給大家介紹了關(guān)于JavaScript注冊(cè)監(jiān)聽(tīng)事件和清除監(jiān)聽(tīng)事件方式的相關(guān)資料,需要的朋友可以參考下2023-05-05JavaScript實(shí)現(xiàn)的開(kāi)關(guān)燈泡點(diǎn)擊切換特效示例
這篇文章主要介紹了JavaScript實(shí)現(xiàn)的開(kāi)關(guān)燈泡點(diǎn)擊切換特效,涉及javascript事件響應(yīng)及頁(yè)面元素屬性動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-07-07javascript時(shí)間函數(shù)基礎(chǔ)介紹
這篇文章主要介紹了javascript中提供了Date對(duì)象來(lái)進(jìn)行時(shí)間和日期的計(jì)算,這里簡(jiǎn)單的介紹下, 方便需要的朋友2013-03-03探討js字符串?dāng)?shù)組拼接的性能問(wèn)題
這篇文章主要介紹了有關(guān)js對(duì)字符串?dāng)?shù)組進(jìn)行拼接的性能問(wèn)題,字符串連接一直是js中性能最低的操作之一,應(yīng)該如何解決呢?請(qǐng)參看本文的介紹2014-10-10詳解javascript獲取url信息的常見(jiàn)方法
本篇文章主要對(duì)javascript獲取url信息的常見(jiàn)方法進(jìn)行介紹,具有很好的參考價(jià)值,需要的朋友一起來(lái)看下吧2016-12-12javascript 中按屬性值查找數(shù)組中的對(duì)象多種方法
JavaScript 數(shù)組可以保存混合類型的不同值,例如字符串、空值或布爾值,并且不需要數(shù)組的大小來(lái)指定它在哪里自動(dòng)增長(zhǎng)和動(dòng)態(tài),這篇文章主要介紹了javascript 中按屬性值查找數(shù)組中的對(duì)象多種方法,需要的朋友可以參考下2023-06-06JavaScript如何實(shí)現(xiàn)LRU緩存淘汰算法
LRU(Least Recently Used)緩存淘汰算法是一種常見(jiàn)的緩存淘汰策略,它的核心思想是優(yōu)先淘汰最近最少使用的緩存數(shù)據(jù),以保證緩存中的數(shù)據(jù)始終是最熱門(mén)的。本文主要介紹了一些關(guān)于如何實(shí)現(xiàn)LRU緩存淘汰算法的方法,感興趣的小伙伴可以參考一下2023-04-04