4. 操作符
4.6 关系操作符
关系操作符(<,>,<=,>=)用于对两个值进行比较,比较的规则与我们数学课上所学的一样。当操作数使用了非数值时,也要进行相应的数据转化。以下是相应的比较规则:
- 两个操作数都是数值,则执行数值比较
- 两个操作数都是字符串,比较两个字符串的字符编码值
- 如果一个操作数是数值,则将另一个操作数转换为数值,然后执行数值比较
- 如果一个操作数是对象,则调用操作数的valueOf()方法,用得到的结果按照前面的规则进行比较。如果对象没有valueOf()方法,则调用toStirng()方法,然后用得到的结果按照前面的规则进行比较。
- 如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较
任何操作数与NaN进行比较,结果都是false。
4.7 相等操作符
ECMAScript提供了两组相等操作符,==和===。==操作符在比较两个操作数前,会先将两个操作数转换为相同类型然后执行比较。而===操作符仅比较而不转换。
在转换不同的数据类型时,相等(==)和不相等(!=)操作符遵循以下规则:
- 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值(false=>0,true=>1)。
- 如果一个操作数是字符串,另一个操作数是数值,在比较相等性时将字符串转换为数值。
- 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型按照前面的规则进行比较。
- null和undefined是相等的
- 比较相等性时,不能将null和undefined转换为其他任何值
- 如果一个操作数时NaN,相等操作返回false。不相等操作返回true
- 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数指向同一个对象,相等操作返回true,否则返回false
除了在比较前不转换操作数之外,全等(===)和不全等(!==)操作符与相等和不相等操作符没有任何区别。例如:
var rs1 = ("55" == 55); //true
var rs2 = ("55" === 55); //false
var rs3 = (undefined == null); //true
var rs4 = (undefined === null); //false
由于相等和不相等操作符存在类型转换问题,而为了保持代码中数据类型的完整性,我们推荐使用全等和不全等操作符。