眾所周知蕴潦,Javascript是一門弱類型語(yǔ)言(weakly typed or untyped language)。這也造成了諸多問題潭苞,如何進(jìn)行邏輯比較便是問題之一。
首先僧诚,我們需要了解的是,由于Javascript的變量不具有類型振诬,所以其在創(chuàng)造比較運(yùn)算符的時(shí)候加入了值比較和值&類型比較,如下所示:
// 進(jìn)行等于邏輯運(yùn)算時(shí)
== // 僅進(jìn)行值比較肩豁,不進(jìn)行類型比較
=== // 進(jìn)行值比較辫呻,且進(jìn)行類型比較
// 進(jìn)行大小比較邏輯運(yùn)算時(shí)
<, <=, >, >= // 僅進(jìn)行值比較,不進(jìn)行類型比較
在變量進(jìn)行比較的時(shí)候放闺,又可以分為以下幾種情況:
- 數(shù)字 比較 數(shù)字
- 數(shù)字 比較 字符串
- 字符串 比較字符串
數(shù)字 比較 數(shù)字
在數(shù)字同數(shù)字比較時(shí),Javascript解釋器(后統(tǒng)稱解釋器)首先會(huì)判斷兩個(gè)變量是否為數(shù)字類型篡悟,如果是匾寝,則可以直接進(jìn)行數(shù)字大小判斷,如下所示:
1 == 1 // true
1 == 2 // false
1 < 2 // true
1 > 2 // false
...
數(shù)字 比較 字符串
在數(shù)字同字符串進(jìn)行比較時(shí)艳悔,解釋器首先會(huì)將字符串進(jìn)行數(shù)字化處理(也許是Number操作,具體還需要參考不同瀏覽器Javascript引擎比較運(yùn)算符邏輯實(shí)現(xiàn))抡锈,然后再進(jìn)行比較乔外。
需要注意的是,數(shù)字字符串在數(shù)字化后會(huì)被轉(zhuǎn)換為對(duì)應(yīng)數(shù)字袁稽;非數(shù)字字符串在數(shù)字化時(shí)始終會(huì)被轉(zhuǎn)換為
NaN
,而任意數(shù)字同NaN
進(jìn)行邏輯運(yùn)算补疑,始終會(huì)返回false
歹撒。如下所示:
// 數(shù)字同數(shù)字字符串進(jìn)行比較
1 > '2' // false
1 < '2' // true
1 == '1' // true
1 === '1' // false
...
// 數(shù)字同非數(shù)字字符串進(jìn)行比較
1 > 'a' // false
1 < 'a' // false
1 == 'a' // false
1 === 'a' // false
...
// 數(shù)字同NaN進(jìn)行比較
1 > NaN // false
1 < NaN // false
1 == NaN // false
1 === NaN // false
字符串 比較 字符串
字符串與字符串進(jìn)行比較時(shí),就比較有意思了暖夭。當(dāng)一個(gè)字符串同另一個(gè)字串進(jìn)行比較邏輯運(yùn)算時(shí)撵孤,會(huì)按照字符在串中出現(xiàn)的順序竭望,依次進(jìn)行ASCII編碼的十進(jìn)制運(yùn)算,直到一方字符結(jié)束(只會(huì)比較相同位置的字符)闭专,通俗一點(diǎn)來說,就是進(jìn)行碼位計(jì)算(也許是String.prototype.charCodeAt操作影钉,具體還需要參考不同瀏覽器Javascript引擎比較運(yùn)算符邏輯實(shí)現(xiàn))掘剪。如下所示:
// 相同長(zhǎng)度比較
'0' > '1' // false
// 流程如下:
1. 左 = '0'.charCodeAt(0) // 48
2. 右 = '1'.charCodeAt(0) // 49
3. 48 > 49 // false
4. 左 > 右 // false
// 不同長(zhǎng)度比較
'12' > '101' // true
// 流程如下:
// 第一位相同,故省去比較步驟
1. 左 = '2'.charCodeAt(0) // 50
2. 右 = '0'.charCodeAt(0) // 48
3. 多出的一位不再進(jìn)行比較
4. 50 > 48 // true
5. 左 > 右 // true
// 再來一個(gè)例子廉赔,有助消化
'2a' > '1b' // true
// 流程如下:
1. 左1 = '2'.charCodeAt(0) // 50
2. 右1 = '1'.charCodeAt(0) // 49
3. 左2 = 'a'.charCodeAt(0) // 97
4. 右2 = 'b'.charCodeAt(0) // 98
5. 左1 > 右1 // true
6. 由于首位已經(jīng)左邊大于右邊了予权,無(wú)論還有多少位字符,都不用再進(jìn)行比較扫腺,可直接得出結(jié)論
7. 左 > 右 // true
// 機(jī)智一點(diǎn)的同學(xué)應(yīng)該已經(jīng)察覺村象,由于ASCII編碼中,美式英文字符是區(qū)分大小寫的厚者,
// 故得出的十進(jìn)制編碼表示也不一致,固有以下情況:
// 大小寫英文比較
'a' < 'A' // false
左 = 'a'.charCodeAt(0) // 97
右 = 'A'.charCodeAt(0) // 65
顯然账忘,97 > 65熙宇,故這個(gè)比較結(jié)果為false。
參考文獻(xiàn)
https://www.w3schools.com/js/js_comparisons.asp
https://stackoverflow.com/questions/10863092/why-is-string-11-less-than-string-3
https://en.wikipedia.org/wiki/Strong_and_weak_typing
https://zh.wikipedia.org/wiki/ASCII