欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Javascript的比較匯總

 更新時(shí)間:2016年07月25日 11:17:00   作者:簡書作者  
本文匯總了Javascript中兩個對象的比較、不同類型的比較以及對象跟原始值的比較,并進(jìn)行了實(shí)例演示,希望能幫助到有需要的朋友們。

在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)置類首先嘗試使用ValueOf轉(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)文章

最新評論