Javascript的比較匯總
在Javascript應(yīng)用過程中會遇到各式各樣的比較,今天給大家整理了三種情況,一起來學(xué)習(xí)下。
1.兩個對象的比較
Javascript的比較中參雜了一些比較奇怪的特性,我們來看一些比較簡單的比較。
// 原始值的比較 > var a = 12 undefined > var b = 12 undefined > a == b true > a === b true // 對象的比較 > var c = [] undefined > var d = [] undefined > c == d false > c === d false
由上面的結(jié)果可以看出比較兩個原始值跟比較對象規(guī)則似乎有點(diǎn)不同,比較兩個對象值的話即便它們的值相同,但是最后的結(jié)果是不一樣的。比較兩個對象,應(yīng)該比較的是兩個對象的引用。
如果我們這樣操作:
> var m = {} undefined > n = m {} > n === m true
表示兩個變量都指向同一個對象,所以它們就是相同的了。
2.不同類型的比較
還有下面這個比較特殊的情況
> 12 == "12" true > null == undefined true > undefined == false false > null == false false > null === undefined false
為什么整型能夠等于字符串?這是由于==(等于而非全等)并不比較類型,它比較之前會將需要比較的值進(jìn)行類型轉(zhuǎn)換,這里的話會將字符串轉(zhuǎn)換成數(shù)值類型然后進(jìn)行比較。為什么這么肯定? 我們做一下實(shí)驗(yàn)。
> 1 + 2 3 > 1 + "2" '12' > 2 < "12" true > "2" < "12" false
從上面例子可以看出,數(shù)值2確實(shí)是比字符串12小的。如果比較之前是數(shù)值轉(zhuǎn)換成字符串那結(jié)果應(yīng)該是"2" > "12"才對。
還不相信?我再舉個例子。
> "12d" > 12 false > "12d" < 12 false > "12d" == 12 false > "12" < "12d" true
這是為什么呢?如果是將12轉(zhuǎn)換成字符串的話,那12d應(yīng)該是大于12才對吧。為什么怎么比較都是false?我估計(jì)是由于下面這個特殊的家伙。
> NaN < 1 false > NaN > 1 false
NaN無論跟什么進(jìn)行比較,都會返回false。包括它自己。所以要判斷一個變量是不是NaN最好的辦法就是x != x如果返回的是true則表明x是NaN。那么這里應(yīng)該就是當(dāng)12d要轉(zhuǎn)換成數(shù)值類型的時(shí)候由于帶有特殊的字符,最后變成了NaN了,跟數(shù)值類型無論怎么比較結(jié)果都是false。
對于數(shù)字與字符串操作符來說,加號運(yùn)算符跟比較運(yùn)算符的行為有所不同。加號運(yùn)算符更偏愛字符串,如果其中一個操作數(shù)是字符串的話則會轉(zhuǎn)換成字符串。而比較運(yùn)算符則比較偏愛數(shù)字,只有在兩個數(shù)字都為字符串的時(shí)候才會進(jìn)行字符串比較。
至于上面的null 跟 undefined。。。。。我暫時(shí)也不知道怎么解釋它們的行為。我也只能姑且記住。因?yàn)樗鼈儽容^特殊。
3.對象跟原始值的比較
如果兩個需要比較的對象一個是javascript對象一個是字符串,則會進(jìn)行某種程度上的類型轉(zhuǎn)換。想辦法把對象的值轉(zhuǎn)換成原始值。一般來說就有valueOf, toString
兩種方法。下面是一個空對象的轉(zhuǎn)換流程:
// 我直接明文寫出來了 > a = {} {} // 1. valueOf 轉(zhuǎn)換 > a.valueOf() {} // 2. 如果上面操作得到的不是一個原始值則進(jìn)而用toString 轉(zhuǎn)換。(反之亦然) > a.toString() '[object Object]' > a == '[object Object]' true
上面其實(shí)是一個內(nèi)置對象的轉(zhuǎn)換過程,也是javascript的機(jī)制。首先它會調(diào)用valueOf
進(jìn)行轉(zhuǎn)換,如果得到的值并不是一個原始值,則會進(jìn)而調(diào)用toString
進(jìn)行轉(zhuǎn)換,最后得到的值是'[object Object]'
一個很奇怪的值,不過它是原始值。如果把變量a跟這個值做相等判斷(不是全等)則可以得出一個true的結(jié)果。(是不是被它搞崩潰了?)
然而權(quán)威指南給了如下原則,我們可以參考一下。
原始值的轉(zhuǎn)換JavaScript語言核心內(nèi)置類首先嘗試使用ValueO
f轉(zhuǎn)換,然后使用toString
進(jìn)行轉(zhuǎn)換。除了日期類,它只使用toString
進(jìn)行轉(zhuǎn)換。那些不是JavaScript核心中的對象則通過各自的實(shí)現(xiàn)中定義的方式來轉(zhuǎn)換為原始值。
根據(jù)上面的解釋。我們的a={}與原始值進(jìn)行比較的時(shí)候,會先調(diào)用valueOf
函數(shù),它的結(jié)果是{}顯然不是一個原始值。則會使用toString
進(jìn)行轉(zhuǎn)換。最后得出了那個很奇怪的結(jié)果。不過這個很奇怪的結(jié)果'[object Object]'
確實(shí)是 {}的原始值。(它是字符串的字面量)。
以上就是Javascript中的比較匯總,希望本文所述對大家學(xué)習(xí)javascript時(shí)有所幫助。
相關(guān)文章
javascript實(shí)現(xiàn)動態(tài)側(cè)邊欄代碼
這篇文章主要介紹了javascript實(shí)現(xiàn)動態(tài)側(cè)邊欄代碼,需要的朋友可以參考下2014-02-02javascript的document中的動態(tài)添加標(biāo)簽實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄獪\談javascript的document中的動態(tài)添加標(biāo)簽實(shí)現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10JS實(shí)現(xiàn)的倒計(jì)時(shí)恢復(fù)按鈕點(diǎn)擊功能【可用于協(xié)議閱讀倒計(jì)時(shí)】
這篇文章主要介紹了JS實(shí)現(xiàn)的倒計(jì)時(shí)恢復(fù)按鈕點(diǎn)擊功能,可用于協(xié)議閱讀倒計(jì)時(shí),涉及javascript基于setInterval的時(shí)間定時(shí)觸發(fā)相關(guān)操作技巧,需要的朋友可以參考下2018-04-04bootstrap中的 form表單屬性role="form"的作用詳解
這篇文章主要介紹了bootstrap中的 form表單屬性role="form"的作用詳解,非常不錯,具有參考借鑒價(jià)值,需要的朋友參考下吧2017-01-01