确定两个变量是否相等是编程中的一个非常重要的操作。在比较字符串、数值和布尔值的相等性时,问题还比较简单。但在涉及到对象的比较时,问题就变得复杂了。
最早的ECMAScript中相等和不等操作符会在执行比较之前,先将对象转换成相似的类型。后来,有人提出了这种转换到底是否合理的质疑:最后,ECMAScript的解决方案就是提供两组操作符:相等和不相等——先转换再比较,全等和不全等——仅比较而不转换。
1.相等和不相等
ECMAScript中的相等操作符由两个等于号(==)表示,如果两个操作数相等,则返回true。而不相等操作符由叹号后跟等于号(!-)表示,如果两个操作数不相等,则返回true。这两个操作符都会先转换操作数(通常称为强制转型),然后再比较它们的相等性。
在转换不同的数据类型时,相等和不相等操作符遵循下列基本规则:
◎如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值-false转换为0,而true转换为l;
◎如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
◎如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的原始值按照前面的规则进行比较;
这两个操作符在进行比较时则要遵循下列规则。
◎null和undefined是相等的。
◎要比较相等性之前,不能将null和unde fined转换成其他住何值。
◎如果有一个操作数是NaN,则相等操作符返回false,而不相等操作符返回true。重要提示:
即使两个操作数都是NaN,相等操作符也返回false;因为按照规则,NaN不等于NaN。
◎如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,
则相等操作符返回true;否则,返回false。
下表列出了一些特殊情况及比较结果:
表达式值表达式值
null == undefinedtruetrue == 1true
"NaN" == NaNfalsetrue == 2false
5 == NaNfalseundefined == 0false
NaN == NaNfalsenull == 0false
NaN != NaNtrue"5" == 5true
false == 0true
2.全等和不全等
除了在比较之前不转换操作数之外,全等和不全等操作符与相等和不相等操作符没有什么区别。全等操作符由3个等于号(一)表示,它只在两个操作数未经转换就相等的情况下返回true,如下 面的例子所示:
var resultl=(”55”==55); //true,因为转换后相等
var result2 2(”55”===55); //false,因为不同的数据类型不相等
在这个例子中,第一个比较使用的是相等操作符比较字符串”55”和数值55,结果返回了true。
如前所述,这是因为字符串”55”先被转换成了数值55,然后再与另一个数值55进行比较。第二个比较使用了全等搡作符以不转换数值的方式比较同样的字符串和值。在不转换的情况下,字符串当然不等于数值,因此结果就是false。
不全等操作符由一个叹号后跟两个等于号(!==)表示,它在两个操作数未经转换就不相等的情况下返回t rue。例如:
var resultl=(”55”!=55)j //false,因为转换后相等
var result2 2(”55”!==55); //true,因为不同的数据类型不相等
在这个例子中,第一个比较使用了不相等操作符,而该操作符会将字符串”55“转换成55,结果就与第二个操作数(也是55)相等了。而由于这两个操作数被认为相等,因此就返回了false。第二个比较使用了不全等操作符。假如我们这样想:字符串55与数值55不相同吗?,那么答案一定是:是的(true)。
南昌网页设计公司提醒:由于相等和不相等操作符存在类型转换问题,而为了保持代码中数据类型的完整性,我们推荐使用全等和不全等操作符.
希望本文对广大站长或从事企业网站建设公司的团队有所帮助,如对此不太理解的,可以与南昌网络公司百恒网络技术部联系。我们很高兴与广大站长和从事企业网站建设公司技术人员分享我们的技术和经验。