在進行比較時js會先將兩邊的類型自動轉成一致再對比。
比較首先分為以下幾種情況:
1、純數字之間比較:1<2 //true;(不解釋)
2、純數字與數字型字符串之間比較:222 < '30' //false (此時數字型字符串會轉成純數字再與前面的純數字比較,即222與30相比誰大?當然22嘍!)
ps:這里為啥要把字符串轉成數字,而不是把數字轉成字符串再做對比?
比如將上面的數字222轉‘222’再與'30'對比,那結果就是true了!(字符串做對比,字符串對比接下來會說。),可是實際操作卻不是這樣。。。
但javascript比較奇怪,相比將數字轉成字符串,js會優先選擇將字符串轉成數字。(如果數字轉成字符串,那字符串之間再進行字符編碼對比,而之間將字符串轉成數字就直接對比了)
3、數字與其他字符串之間的比較:222 < 'abc' //false
這種情況下,js會將字符串轉成數字,但abc不能轉為數字,js轉數字的方法:parseInt('abc'),如果解析不到數字,則將返回一個NaN的值。所以'abc’轉換的結果永遠
是NaN,所以結果永遠是false(即222 > 'abc' //false)。
ps:這時候又想問:為什么不能將abc轉成ASCII碼再對比?
那么js就要解釋了:因為222是數字,不是字符串,不能轉ASCII碼,js本着一視同仁的態度就是這個結果了。。。(js有自己的基本准則,它按自己的基本法走)
4、數字型字符串之間比較:'222'<'30' //true; '5'>'10' //true
這種比較為ASCII碼比較,依次取每個字符,字符轉為ASCII碼進行比較,ASCII碼先大的即為大;因為第一個字符3比2大所以后面就不用考慮了;
5、其他字符串之間比較:'d'>'abc' //true;
字符串比較為ASCII碼比較,d的ASCII碼為100,而a的ascii碼為97所以結果為true;
總結一下:
1、純字符串比較,轉換成ASCII碼在進行比較;
2、純數字和數字字符串相比較,則將字符串數字隱式轉換成數字再進行比較;
3、純數字和非數字字符串比較,都返回false;