版权声明:本文为博主原创文章,转载时请注明出处!
确定两个变量是否相等是编程中一个非常重要的操作。在比较字符串、数值和布尔值的相等性时,问题还比较简单,但是在涉及到对象的比较时,问题就变得复杂了。
最早的ECMAScript中的相等和不相等的操作符会在执行比较之前,先将对象转换成相似的类型。后来,有人对于这样的转换是否合理产生了质疑。最后,ECMAScript提供的解决方案就是提供两组操作符:相等和不相等---先转换再比较,全等和不全等---仅比较而不转换。
一、相等和不相等:
1、相等操作符:==,
不相等操作符:!=。
2、JS标准规定:这两个操作符在进行操作数的相等性比较时,会先进行操作数的类型转换(称作“强制转型”),然后再比较操作数的相等性;当两个操作数相等时,则返回true,反之,当两个操作数不相等时,则返回false。
3、在转换不同的数据类型时,相等和不相等操作符遵循以下规则:
3.1、如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值-----false,转换为0,true,转换为1;
3.2、如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
3.3、如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较;
4、这两个操作符在进行比较时要遵循下列规则:
4.1、null和undefined是相等的;
4.2、要比较相等性之前,不能将null和undefined转换成其他类型的任何值;
4.3、如果有一个操作数是NaN,则相等操作符返回false,而不相等操作符返回true。重要提示:即使两个操作数都为NaN,相等操作符也会返回false,因为按照规则,NaN不等于NaN;
4.4、如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都能指向同一个对象,则相等操作符返回true,否则返回false。
5、下面列出一些特殊的情况:
5.1、null == undefined true; "NaN" == NaN false; 5 == NaN false; NaN != NaN true; false == 0 true; true == 1 true; true == 2 false; undefined == 0 false; null == 0 false; "5" == 5 true.
二、全等和不全等
除了在比较之前不转换操作数之外,全等和不全等操作符与相等和不相等操作符没有什么区别。全等操作符由3个等号(===)表示,它只在两个未经转换的操作数相等的前提下才会返回true,如下面的例子所示:
var result1 = ("5555" == 5555); //true,因为转换后相等 var result2 = ("5555" === 5555); //false,因为不同的数据类型不相等,不转换数据类型
在上面这个“栗子”中,第一个比较使用的是相等操作符比较字符串“5555”和数值5555,结果返回了true,如前所述,这是因为字符串“5555”先被转换成了数值5555,然后再与另一个数值5555进行比较。第二个比较使用了全等操作符以不转换数值的方式比较同样的字符串和数值。在不转换的情况下,字符串当然不等于数值,因此就返回false。
不全等操作符(!==),它在两个操作数未经转换的情况下不相等就会返回true,反之则返回false。
var result1 = ("5555" != 5555); //false,转换后应该是相等的,所以返回false var result2 = ("5555" !== 5555); //true,因为不同的数据类型不相等
注意:null == undefined会返回true,因为它们是类似的值;但null === undefined会返回false,因为它们是不同类型的值。