关系操作符
- 在比较字符串时,实际比较的是两个字符串中对应位置的每个字符的字符编码
- 任何操作数与NaN进行关系比较,结果都是false
var result= "Brick" < "alphabet"; //true
在这个例子中,字符串Brick被认为小于字符串alphabet,原因是字母B的字符编码为66,而小写字母a的字符编码是97
如果要按照字母表的顺序比较字符串,就必须把两个操作数都转换为相同的大小写形式(全部大写或全部小写),然后再进行比较,如下所示:
var result="Brick".toLowerCase() < "alphabet".toLowerCase(); //false
通过将这两个操作数都转换为小写的形式,就可以得出alphabet按字母表顺序排在Brick之前的正确判断了
相等操作符
最早在ECMAScript中的相等和不等操作符在执行比较之前,先将对象转换成相似类型。
最后,ECMAScript提供两组操作符:相等和不相等——先转换再比较,全等和全部等——仅比较不转换
相等和不相等
在转换不同的数据类型时,相等和不相等操作符遵循下列基本规则:
- 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,true转换为1
- 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值
- 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型数值按照前面的规则进行比较,这两个操作符在进行比较时则要遵循下列规则:
- null和underfined是相等的
- 要比较相等性之前,不能将null和underfined转换成其他任何值
- 如果有一个操作数是NaN,则相等操作符返回false,不相等操作符返回true
- 即使两个操作数都是NaN,相等操作符也返回false,因为按照规则,NaN不等于NaN
- 如果两个操作数都是对象,则比较他们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true,否则返回false
全等(===)和不全等(!==)
除了在比较之前不转换操作数之外,全等不全等与相等不相等操作符额没有什么区别
var result1=("55" == 55); //true 因为转换后相等
var result2=("55" === 55); //false 因为不转换数据类型不相等
null == underfined会返回true,因为他们是类似的值,但null===underfined会返回false,因为他们是不同类型的值
由于相等和不相等操作符存在类型转换问题,而为了保持代码中数据类型的完整性,推荐使用全等和不全等操作符