JavaScript中有“==”与“===”,那么他们有何区别呢?
对于基本数据类型, === (!==)只有当两个变量的类型和值都相等时,才返回true;而 == (!=)则会对变量进行强制类型转换,只要转换后的值相等,则换回true。
下面结合代码讲一下在转换不同的数据类型时,相等 == 和不相等 != 操作符遵循的强制转型基本规则:
1. 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值:false转换为0,而true转换为1;
false == 0 ??//truetrue == 1 ??//truetrue == 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 ??//trueundefined == 0 ??//falsenull == 0 ??//falseundefined == false ??//falsenull == false ??//false
b. 如果有一个操作数是NaN,则相等操作符 == 返回false,而不相等操作符 != 返回true。
tips:即使两个操作数都是NaN,相等操作符 == 也返回false;因为按照规则, NaN不等于NaN。
NaN == NaN ??//falseNaN != NaN ??//trueNaN == 0 ??//false
c. 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true;否则,返回false。
var obj = new Object()var obj1 = new Object()var obj2 = objalert(obj == obj1) //falsealert(obj == obj2) //truealert(obj === obj1) //false
那么除此之外,还有什么情况下JS代码需要对变量进行强制转型呢?
1. 字符串拼接时:
var a = 1 + 1 ??// 2var 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) ??//0alert(‘‘ || ‘ab‘) ??//‘ab‘alert(!0) ??//truealert(!!100) ??//true
PS: && (逻辑与)和 || 这两逻辑运算符不一定返回布尔值,且都遵循着短路原则。明天单独写一篇随笔好了~
那么我们什么时候使用 == 什么时候使用 === 呢?
答:由于相等 == 和不相等操作符!= 存在类型转换的问题,为了保持代码中数据类型的完整性,红宝书推荐我们尽量使用全等 === 和不全等 != 操作符。而JQuery中有一种这样的写法:
if(obj.a == null){ ???//相当于 obj.a === null || obj.a === undefined的简写形式}
除此之外,我们全部使用 ===。
如有错误,欢迎指出探讨。
JS中的“==”与强制类型转换
原文地址:https://www.cnblogs.com/YiNongLee/p/9261153.html