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 //false2、非嚴(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è)性,且無需進(jìn)行類型轉(zhuǎn)換,效率也更高
3、同值相等
同值相等是用來判斷兩個(gè)值是否是同一個(gè)值,通過Object.is()來判斷,是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) //false4、零值相等
**與同值相等類似,認(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克隆元素樣式的實(shí)現(xiàn)代碼
這是一個(gè)實(shí)驗(yàn)用的玩意,它可以克隆指定元素的最終樣式,并包裝成一個(gè)css類,它還可以證明Oprea 11.10 是個(gè)混球2011-10-10
關(guān)于JavaScript數(shù)組去重的一些理解匯總
這篇文章主要給大家介紹了關(guān)于JavaScript數(shù)組去重的一些理解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
IE6-8中Date不支持toISOString的修復(fù)方法
這篇文章主要介紹了IE6-8中Date不支持toISOString的修復(fù)方法,需要的朋友可以參考下2014-05-05
自己寫的Javascript計(jì)算時(shí)間差函數(shù)
Javascript計(jì)算時(shí)間差函數(shù),獲得時(shí)間差,時(shí)間格式為 年-月-日 小時(shí):分鐘:秒 或者 年/月/日 小時(shí):分鐘:秒。2013-10-10
javascript中錯(cuò)誤使用var造成undefined
這篇文章主要介紹了javascript中錯(cuò)誤使用var造成undefined的原因,實(shí)例分析了錯(cuò)誤使用var造成undefined的過程,感興趣的小伙伴們可以參考一下2016-03-03

