在Javascript應用過程中會遇到各式各樣的比較,今天給大家整理了三種情況,一起來學習下。
1.兩個對象的比較
Javascript的比較中參雜了一些比較奇怪的特性,我們來看一些比較簡單的比較。
// 原始值的比較> var a = 12undefined> var b = 12undefined> a == btrue> a === btrue// 對象的比較> var c = []undefined> var d = []undefined> c == dfalse> c === dfalse
由上面的結果可以看出比較兩個原始值跟比較對象規則似乎有點不同,比較兩個對象值的話即便它們的值相同,但是最后的結果是不一樣的。比較兩個對象,應該比較的是兩個對象的引用。
如果我們這樣操作:
> var m = {}undefined> n = m{}> n === mtrue表示兩個變量都指向同一個對象,所以它們就是相同的了。
2.不同類型的比較
還有下面這個比較特殊的情況
> 12 == "12"true> null == undefinedtrue> undefined == falsefalse> null == falsefalse> null === undefinedfalse
為什么整型能夠等于字符串?這是由于==(等于而非全等)并不比較類型,它比較之前會將需要比較的值進行類型轉換,這里的話會將字符串轉換成數值類型然后進行比較。為什么這么肯定? 我們做一下實驗。
> 1 + 23> 1 + "2"'12'> 2 < "12"true> "2" < "12"false
從上面例子可以看出,數值2確實是比字符串12小的。如果比較之前是數值轉換成字符串那結果應該是"2" > "12"才對。
還不相信?我再舉個例子。
> "12d" > 12false> "12d" < 12false> "12d" == 12false> "12" < "12d"true
這是為什么呢?如果是將12轉換成字符串的話,那12d應該是大于12才對吧。為什么怎么比較都是false?我估計是由于下面這個特殊的家伙。
> NaN < 1false> NaN > 1false
NaN無論跟什么進行比較,都會返回false。包括它自己。所以要判斷一個變量是不是NaN最好的辦法就是x != x如果返回的是true則表明x是NaN。那么這里應該就是當12d要轉換成數值類型的時候由于帶有特殊的字符,最后變成了NaN了,跟數值類型無論怎么比較結果都是false。
對于數字與字符串操作符來說,加號運算符跟比較運算符的行為有所不同。加號運算符更偏愛字符串,如果其中一個操作數是字符串的話則會轉換成字符串。而比較運算符則比較偏愛數字,只有在兩個數字都為字符串的時候才會進行字符串比較。
至于上面的null 跟 undefined。。。。。我暫時也不知道怎么解釋它們的行為。我也只能姑且記住。因為它們比較特殊。
3.對象跟原始值的比較
如果兩個需要比較的對象一個是javascript對象一個是字符串,則會進行某種程度上的類型轉換。想辦法把對象的值轉換成原始值。一般來說就有valueOf, toString兩種方法。下面是一個空對象的轉換流程:
// 我直接明文寫出來了> a = {}{}// 1. valueOf 轉換> a.valueOf(){}// 2. 如果上面操作得到的不是一個原始值則進而用toString 轉換。(反之亦然)> a.toString()'[object Object]'> a == '[object Object]'true上面其實是一個內置對象的轉換過程,也是javascript的機制。首先它會調用valueOf進行轉換,如果得到的值并不是一個原始值,則會進而調用toString進行轉換,最后得到的值是'[object Object]'一個很奇怪的值,不過它是原始值。如果把變量a跟這個值做相等判斷(不是全等)則可以得出一個true的結果。(是不是被它搞崩潰了?)
然而權威指南給了如下原則,我們可以參考一下。
原始值的轉換JavaScript語言核心內置類首先嘗試使用ValueOf轉換,然后使用toString進行轉換。除了日期類,它只使用toString進行轉換。那些不是JavaScript核心中的對象則通過各自的實現中定義的方式來轉換為原始值。
根據上面的解釋。我們的a={}與原始值進行比較的時候,會先調用valueOf函數,它的結果是{}顯然不是一個原始值。則會使用toString進行轉換。最后得出了那個很奇怪的結果。不過這個很奇怪的結果'[object Object]'確實是 {}的原始值。(它是字符串的字面量)。
以上就是Javascript中的比較匯總,希望本文所述對大家學習javascript時有所幫助。
新聞熱點
疑難解答