关系操作符
关系操作符执行比较两个值的操作,包括小于(<)
,大于(>)
,小于等于(<=)
和大于等于(>=)
。这几个操作符都返回布尔值,如下所示:
let result1 = 5 > 3; // true
let result2 = 5 < 3; // false
与ECMAScript中的其他操作符
一样,在将他们应用到不同数据类型
的时候也会发生类型转换
和其他行为
。
- 如果操作数都是数值,则执行数值比较。
- 如果有一个操作数是
NaN
,无论是大于还是等于结果都是false
。 - 如果操作数都是
字符串
,则逐个比较字符串对应的编码
。 - 如果有任一操作数是
数值
,则将另一个操作数转换为数值
,在执行数值比较。 - 如果有任一操作数是
布尔值
,则将其转换为数值在执行比较 - 如果任一操作数是一个
对象
,则调用valueOf()
方法 如果返回的是一个原始值(比如数字)并按照上述规则转换返回的值。 如果valueOf()
方法返回的仍然是一个对象 则调用toString()
方法 在按照字符串的规则转换
因为在使用关系 操作符
比较两个字符串的时候,会比较字符串中对应的编码
,这些编码是数值格式。比较完之后,会返回布尔值
。
let result = "Brick" < "alphabet"; //true
这里字母 B
的编码是66
,字母a
的编码是 97
所以要得到字母顺序
比较的结果,就必须把两者转换成相同的大小写形式(全大写或者全部小写)
。
两个操作数都转换为小写,就能保证按照字母标表顺序判定alphabet
在Brick
前面
let result = "Brick".toLowerCase() < "alphabet".toLowerCase(); //false
在比较两个数值字符串的时候,比如下面这个例子:
let result = "23" < "3"; //true;
这里在比较字符串"23"
和"3"
时返回 true。因为两个操作数都是字符串,所以会逐个比较它们的字符编码(字符"2"
的编码时 50
,而字符3
的编码时 51
)。
如果有一个操作数时数值就对了:
let result = "23" < 3; //false;