对两个字符串运用关系运算符,许多人认为小于表示“在字母顺序上靠前”,大于表示“在字母顺序上靠后”,但是事实并非如此。对于字符串,第一个字符串中的每个字符的代码都会和第二个字符串中对应位置上的字符的代码进行比较。完成这种比较操作后,会返回一个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,则情况并非如此。