"==="叫做嚴(yán)格運(yùn)算符躲履,"=="叫做相等運(yùn)算符季眷。嚴(yán)格運(yùn)算符的運(yùn)算規(guī)則如下猫牡,(1)不同類型值如果兩個(gè)值的類型不同墓猎,直接返回false。(2)同一類的原始類型值同一類型的原始類型的值(數(shù)值赚楚、字符串毙沾、布爾值)比較時(shí),值相同就返回true宠页,值不同就返回false左胞。(3)同一類的復(fù)合類型值兩個(gè)復(fù)合類型(對(duì)象、數(shù)組举户、函數(shù))的數(shù)據(jù)比較時(shí)烤宙,不是比較它們的值是否相等,而是比較它們是否指向同一個(gè)對(duì)象俭嘁。(4)undefined和nullundefined 和 null 與自身嚴(yán)格相等躺枕。
null === null //true
undefined === undefined //true
相等運(yùn)算符在比較相同類型的數(shù)據(jù)時(shí),與嚴(yán)格相等運(yùn)算符完全一樣供填。在比較不同類型的數(shù)據(jù)時(shí)拐云,相等運(yùn)算符會(huì)先將數(shù)據(jù)進(jìn)行類型轉(zhuǎn)換,然后再用嚴(yán)格相等運(yùn)算符比較近她。類型轉(zhuǎn)換規(guī)則如下:(1)原始類型的值原始類型的數(shù)據(jù)會(huì)轉(zhuǎn)換成數(shù)值類型再進(jìn)行比較叉瘩。字符串和布爾值都會(huì)轉(zhuǎn)換成數(shù)值,所以題主的問題中會(huì)有第二個(gè)string輸出粘捎。(2)對(duì)象與原始類型值比較對(duì)象(這里指廣義的對(duì)象薇缅,包括數(shù)值和函數(shù))與原始類型的值比較時(shí),對(duì)象轉(zhuǎn)化成原始類型的值攒磨,再進(jìn)行比較泳桦。(3)undefined和nullundefined和null與其他類型的值比較時(shí),結(jié)果都為false娩缰,它們互相比較時(shí)結(jié)果為true蓬痒。(4)相等運(yùn)算符的缺點(diǎn)相等運(yùn)算符隱藏的類型轉(zhuǎn)換,會(huì)帶來一些違反直覺的結(jié)果漆羔。
'' == '0' // false
0 == '' // true
0 == '0' // true
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t\r\n ' == 0 // true
這就是為什么建議盡量不要使用相等運(yùn)算符梧奢。至于使用相等運(yùn)算符會(huì)不會(huì)對(duì)后續(xù)代碼造成意外影響,答案是有可能會(huì)演痒。
var a = undefined;
if(!a){
console.log("1"); //1
}
var a = undefined;
if(a == null){
console.log("1"); //1
}
var a = undefined;
if(a === null){
console.log("1"); //無輸出
}
也就是說當(dāng)a為undefined時(shí)谤辜,輸出的值會(huì)有變化,而在編程中對(duì)象變成undefined實(shí)在是太常見了