對兩個字符串運用關系運算符,許多人認為小於表示“在字母順序上靠前”,大於表示“在字母順序上靠后”,但是事實並非如此。對於字符串,第一個字符串中的每個字符的代碼都會和第二個字符串中對應位置上的字符的代碼進行比較。完成這種比較操作后,會返回一個Boolean值。問題在於大寫字母的代碼都小於小寫字母的代碼,這就意味着可能會遇到下面這種情況:
var bResult = "Brick" < "alpha";
alert(bResult);// output:true;
在這個例子中,字符串“Brick”小於字符串“alpha”,因為字母B的字符代碼是66,字母a的字符代碼是97。要強制得到按照字母順序比較得到的結果,必須把兩個運算數轉換成相同的大小寫形式(全大寫或者全小寫)然后在盡行比較。例如:
var bResult = "Brick".toLowerCase() < "alpha".toLowerCase();
alert(bResult);// output:false;
另一種棘手的情況發生在比較兩個字符串形式的數字的時候,例如:
var bResult= "23" < "3";
alert(bResult);//output:true;
因為這兩個運算時都是字符串,因此將比較他們的字符代碼(”2“的字符代碼是50;”3“的字符代碼是51)因此輸出true;
不過把上述例子中的其中一個運算符改為數字的時候,那么就有趣了,例如:
var bResult= "23" < 3;
alert(bResult);//output:false;
如論合適比較一個字符串數字和一個數字,ECMAscript都會把字符串的數字轉化為數字,然后在比較大小。
不過,如果字符串不能被轉化成數字的時候,又該怎么辦呢?
var bResult= "a" < 3;
alert(bResult);//output:false;
字母a不能換轉成有意義的數字,不過調用parseInt()方法,返回的是NaN,根據規則,任何包含NaN的關系運算都要返回false,因此這段代碼也輸出false;
var bResult= "a" < 3;
alert(bResult);//output:false;
通常,如果小於運算的兩個值返回false,那么大於等於運算必須返回true;不過如果某個數字是NaN,則情況並非如此。