相等操作符
确定两个变量是否相等是编程中的一个非常重要的操作。在比较字符串、数值和布尔值的相等性时,问题还比较简单。但在涉及到对象的比较时,问题就变得复杂了。最早的ECMAScript中的相等和不等操作符会在执行比较之前,先将对象转换成相似的类型。后来,有人提出了这种转换到底是否合理的质疑。最后,ECMAScript的解决方案就是提供两组操作符:相等和不相等——先转换再比较,全等和不全等——仅比较而不转换。
1.相等和不相等
ECMAScript中的相等操作符由两个等于号(==)表示,如果两个操作数相等,则返回true。而不相等操作符由叹号后跟等于号(!=)表示,如果两个操作数不相等,则返回true。这两个操作符都会先转换操作数(通常称为强制转型),然后再比较它们的相等性。在转换不同的数据类型时,相等和不相等操作符遵循下列基本规则:
这两个操作符在进行比较时则要遵循下列规则。
下表列出了一些特殊情况及比较结果: | |||
表达式 | 值 | 表达式 | 值 |
null == undefined | true | true == 1 | true |
"NaN" == NaN | false | true == 2 | false |
5 == NaN | false | undefined == 0 | false |
NaN == NaN | false | null == 0 | false |
NaN != NaN | true | "5" == 5 | true |
false == 0 | true |
2.全等和不全等
除了在比较之前不转换操作数之外,全等和不全等操作符与相等和不相等操作符没有什么区别。全等操作符由3个等于号(===)表示,它只在两个操作数未经转换就相等的情况下返回true,如下面的例子所示:
var result1 = ("55" == 55);
var result2 = ("55" === 55);
在这个例子中,第一个比较使用的是相等操作符比较字符串"55"和数值55,结果返回了true。如前所述,这是因为字符串"55"先被转换成了数值55,然后再与另一个数值55进行比较。第二个比较使用了全等操作符以不转换数值的方式比较同样的字符串和值。在不转换的情况下,字符串当然不等于数值,因此结果就是false。不全等操作符由一个叹号后跟两个等于号(!==)表示,它在两个操作数未经转换就不相等的情况下返回true。例如:
var result1 = ("55" != 55);
var result2 = ("55" !== 55);
在这个例子中,第一个比较使用了不相等操作符,而该操作符会将字符串"55"转换成55,结果就与第二个操作数(也是55)相等了。而由于这两个操作数被认为相等,因此就返回了false。第二个比较使用了不全等操作符。假如我们这样想:字符串55与数值55不相同吗?,那么答案一定是:是的(true)。记住:null == undefined会返回true,因为它们是类似的值;但null === undefined会返回false,因为它们是不同类型的值。
由于相等和不相等操作符存在类型转换问题,而为了保持代码中数据类型的完整性,我们推荐使用全等和不全等操作符。