今天看一些項目文檔蚜厉,找到了一個ele的node面試文檔洒宝,里面總結(jié)了一些招聘問題厨疙,我感覺還是有點干貨
中文地址
English Entry
js中 == 和 === 有什么區(qū)別
“===”叫做嚴格運算符薇正,”==”叫做相等運算符洛心。
嚴格運算符的運算規(guī)則如下
- 不同類型值如果兩個值的類型不同,直接返回false。
- 同一類的原始類型值同一類型的原始類型的值(數(shù)值镇辉、字符串屡穗、布爾值)比較時,值相同就返回true忽肛,值不同就返回false村砂。
- 同一類的復(fù)合類型值兩個復(fù)合類型(對象、數(shù)組屹逛、函數(shù))的數(shù)據(jù)比較時础废,不是比較它們的值是否相等,而是比較它們是否指向同一個對象罕模。
- undefined和null,undefined 和 null 與自身嚴格相等评腺。
null === null //true
undefined === undefined //true
相等運算符在比較相同類型的數(shù)據(jù)時,與嚴格相等運算符完全一樣淑掌。在比較不同類型的數(shù)據(jù)時蒿讥,相等運算符會先將數(shù)據(jù)進行類型轉(zhuǎn)換,然后再用嚴格相等運算符比較抛腕。
相等運算符類型轉(zhuǎn)換規(guī)則如下:
- 原始類型的值原始類型的數(shù)據(jù)會轉(zhuǎn)換成數(shù)值類型再進行比較芋绸。字符串和布爾值都會轉(zhuǎn)換成數(shù)值,所以題主的問題中會有第二個string輸出担敌。
- 對象與原始類型值比較對象(這里指廣義的對象摔敛,包括數(shù)值和函數(shù))與原始類型的值比較時,對象轉(zhuǎn)化成原始類型的值全封,再進行比較
- undefined和null,undefined和null與其他類型的值比較時马昙,結(jié)果都為false,它們互相比較時結(jié)果為true售貌。
- 相等運算符的缺點相等運算符隱藏的類型轉(zhuǎn)換给猾,會帶來一些違反直覺的結(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
這就是為什么建議盡量不要使用相等運算符颂跨。
至于使用相等運算符會不會對后續(xù)代碼造成意外影響,答案是有可能會扯饶。
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"); //無輸出
}
//也就是說當a為undefined時恒削,輸出的值會有變化,而在編程中對象變成undefined實在是太常見了