小于(<)、大于(>)、小于等于(<=)和大于等于(>=)这几个关系操作符用于对两个值进行比较,比较的规则和数学课上学的以制。这几个操作符都返回布尔值,如下面的例子:
var result1 = 15 > 10;//true
var result2 = 15 < 10;//false
与ECMAScript中其他操作符一样,当关系操作符的操作数使用了非数值是,也要进行数据类型转换,或完成默写奇怪的操作。以下就是相应的规则:
*如果两个操作数都是数值,则执行数值比较;
*如果两个操作数都是字符串,则比较两个字符串对应的字符编码值;
*如果一个操作数是数值,则将另外一个操作数转换为一个数值,然后执行数值比较;
*如果一个操作数是对象,则调用这个对象的valueOf()方法,用得到的结果按照前面的规则进行比较。如果对象么有valueOf()方法,则调用toString()方法,并用得到的结果根据前面的规则执行比较;
*如果一个操作数是布尔值,则先将其转换为数值,然后执行比较。
奇怪的操作,例子:
var result = "Brick" < "alphabet";//true
原因是,字母B的字符编码是66,而字母a的字符编码是9。如果要真正按字母表顺序比较的话,必须将两个操作数转换为相同的大小写形式,然后再执行比较,如下面的例子:
var result = "Brick".toLowerCase() < "alphabet".toLowerCase();//false
另外一个奇怪的情况,例子:
var result = "23" < "3";//true
因为,两个操作数都是字符,所以还是按照字符编码来比较的。(2的字符编码是50,3的字符编码是51)
换种写法:
var result = "23" < 3;//false
这个时候,因为操作数中有一个操作数是数值,则将另外一个操作数也转换为数值。
但是如果字符串不能转换为数值呢?见下面的例子:
var result = "a" < 3;//false,应为a被转换成了NaN
因为,根据规则,然和操作数与NaN进行比较,结果都是false。
最后强调下,见例子:
var result = NaN < 3;//false
var result = NaN >= 3;//false
网友评论