当对两个值进行比较时,关系操作符(<、>、>=、<=)比较的规则和我们数学课上学习的一样。当使用了非数值比较时会遵循以下规则:
- 如果两个操作数都是数值,则进行数值比较
- 如果两个操作数都是字符串,则比较两个字符串对应的字符编码。
- 如果一个操作数是数值,则将另外一个操作数转换为数值,然后进行数值比较。
- 如果一个操作数是对象,则调用对象的valueOf()方法,用得到的结果按照前面规则比较。如果对象没有valueOf()方法,则调用toString()方法,并用得到的结果按照前面规则比较。
- 如果一个操作数的布尔值,则先将其转换为数值,然后再执行比较。
奇怪现象:
1. 两个操作数都是字符串时出现比较结果不正确
var result = "Brick " < "alpha"; //true
很多人认为,在比较字符串时候,小于的意思是字符位置靠前,大于的意思是字符位置靠后,实际上完全不是那么回事。在比较两个字符串时候,比较的是两个字符串中对应位置的字符编码值,经过比较后再返回一个布尔值。由于大写字母的编码小于小写字母,因此我们会看到上面奇怪的现象。
解决办法:
将两个操作数都转换成统一的大写或者小写。
var result = "Brick" .toLowerCase() < "alpha".toLowerCase(); //false
2. 两个操作数都是包含数字的字符串
var result = "23" < "3"; //true
由于比较的是字符编码,“2”的字符编码是50,而“3”的字符编码是51。
解决办法:
将其中一个操作数转换为数字
var result = "23" < 3; //false
此时就会正确。但是当操作数不能转换成数字的时候呢?
3.当操作数不能转换成数字时出现的奇怪现象
var result = "a" < 3;//false
既然小于不成立,按照我们的逻辑,它应该就是>=,如下:
var result = "a" >= 3; //false
按照常规,一个值不小于另一个值,则必然大于或者等于那个值,然而,在与NaN进行比较时,这两个比较操作的结果都返回了false。
在使用过程中一定要有这个意识!