JS中的“==”与强制类型转换
JavaScript中有“==”与“===”,那么他们有何区别呢?
对于基本数据类型, === (!==)只有当两个变量的类型和值都相等时,才返回true;而 == (!=)则会对变量进行强制类型转换,只要转换后的值相等,则换回true。
下面结合代码讲一下在转换不同的数据类型时,相等 == 和不相等 != 操作符遵循的强制转型基本规则:
1. 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值:false转换为0,而true转换为1;
false == 0 //true true == 1 //true true == 3 //false
2. 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
"123" == 123 //true
3. 如果一个操作数是对象,另一个操作数不是,则调用对象的valueof ()方法,用得到的基本类型值按照前面的规则进行比较;
var a = [ 1 , 2 , 3 ] alert(a == "1,2,3") //true, a.valueOf()为"1,2,3"
需要注意的是:
a. null和undefined是相等的,null和undefined不能转换成其他任何值;
null == undefined //true undefined == 0 //false null == 0 //false undefined == false //false null == false //false
b. 如果有一个操作数是NaN,则相等操作符 == 返回false,而不相等操作符 != 返回true。
tips:即使两个操作数都是NaN,相等操作符 == 也返回false;因为按照规则, NaN不等于NaN。
NaN == NaN //false NaN != NaN //true NaN == 0 //false
c. 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true;否则,返回false。
var obj = new Object() var obj1 = new Object() var obj2 = obj alert(obj == obj1) //false alert(obj == obj2) //true alert(obj === obj1) //false
那么除此之外,还有什么情况下JS代码需要对变量进行强制转型呢?
1. 字符串拼接时:
var a = 1 + 1 // 2 var b = 1 + "1" //11
2. if语句判断时:
if(100){ alert(100) //会执行 } if(!0){ alert(0) //不会执行 } if(!null){ alert(null) //不会执行 } if(!undefined){ alert(undefined) //不会执行 }
3. 逻辑运算符
alert(100 && 0) //0 alert('' || 'ab') //'ab' alert(!0) //true alert(!!100) //true
PS: && (逻辑与)和 || 这两逻辑运算符不一定返回布尔值,且都遵循着短路原则。明天单独写一篇随笔好了~
那么我们什么时候使用 == 什么时候使用 === 呢?
答:由于相等 == 和不相等操作符!= 存在类型转换的问题,为了保持代码中数据类型的完整性,红宝书推荐我们尽量使用全等 === 和不全等 != 操作符。而JQuery中有一种这样的写法:
if(obj.a == null){ //相当于 obj.a === null || obj.a === undefined的简写形式 }
除此之外,我们全部使用 ===。
如有错误,欢迎指出探讨。