首先,有一点编码经验的人都能感受到,确定两个变量是否相等是编程中的一个非常非常重要的操作(就如我们写if判断语句),在比较字符串,数值和布尔值的相等性时,问题还比较简单,但在涉及到对象的比较时,问题就得复杂了。早在ECMAScript标准中,规定先转换操作数在进行比较,但后来,人们开始质疑这种方式是否合理,所以出现了全等的概念。
一、聊一下相等与全等那点区别
相等和不相等 — 先转换再比较
全等和不全等 — 仅比较而不转换
举一个简单的例子:
"5" == 5 // true
先将字符串5转换成数字,在比较,结果就相等,下面来看一个全等的问题。
"55" === 55 // false
因为左边的55是字符串,右边是数字,数据类型不相等,所以不相等。返回就是false
当然,关于相等与不相等,它还有一些特殊情况,如null,undefined,NaN,false等之间的比较,这会涉及到一些比较规则性问题,接下来我会重点说一下,有关比较之前,如何转换操作数的问题。
二、如何转换操作数
全等不全等就没什么说的了,主要是相等和不相等会先转换在比较,且比较的两个操作符都会先转换(通常称为强制转型),然后再比较它们的相等性。下面说两个规则:
第一,操作转换时规则
1、操作数为布尔值,false转换为0,而true转换为1。
注意true == 1 返回true
而true == 2 返回false
2、如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值。
JavaScript中有三个函数可以把字符串转换成数值:Number,parseInt,parseFloat。如下代码所示:
3、如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的原始值按照前面的规则进行比较。如下代码所示:
第二,遵循规则
两个操作符在进行比较时则要遵循下列一些规则。
1、null和undefined是相等的。
2、要比较相等性之前,不能将null和undefined转换成其它任何值。
3、如果有一个操作数是NaN,则相等操作符返回false,则不相等操作符返回true。重要提示一点:即使两个操作数都是NaN,相等操作符也返回false,因为按照规则,NaN不等于NaN。
4、如果两个操作数都是对象,则比较它们是不是同一个对象,如果两个操作数都指向同一个对象,则相等操作符返回true,否则返回false。
看一个例子:
null == undefined // true
5 == NaN // false
三、使用建议
相等(==) 和不相等(!=)操作符会在需要的情况下自动转换数据类型。但 全等(===)和不全等(!==)不会,它们会同时比较值和数据类型,这也使用它们要比相等(==)和不相等(!=)快。
领取专属 10元无门槛券
私享最新 技术干货