JavaScript中有兩種比較相等的運(yùn)算符:== 和 ===。這兩個(gè)運(yùn)算符在使用時(shí)很容易混淆。他們都可以用來(lái)測(cè)試兩個(gè)值是否相等,但是在比較時(shí)卻存在很大差異,本文就來(lái)詳細(xì)分析這兩個(gè)運(yùn)算符的不同之處。
在JavaScript中,== 運(yùn)算符稱為等于運(yùn)算符,它的作用是判斷兩個(gè)值是否相等。如果兩個(gè)值的類(lèi)型不一樣,那么它們會(huì)嘗試被轉(zhuǎn)換為相同的類(lèi)型然后進(jìn)行比較。例如:
1 == "1"; // true,"1"被轉(zhuǎn)換為數(shù)字1 0 == "0"; // true,"0"被轉(zhuǎn)換為數(shù)字0 true == 1; // true null == undefined; // true
然而,由于類(lèi)型轉(zhuǎn)換可能會(huì)出現(xiàn)一些讓人意外的結(jié)果:
" " == 0; // true " " == false; // true
此時(shí),我們就會(huì)不經(jīng)意間犯下這樣的錯(cuò)誤:
if(value == true){ // ... }
這個(gè)判斷語(yǔ)句會(huì)將0、""、null、undefined、false等值都當(dāng)做false來(lái)處理,而只有true、非空字符串以及非零數(shù)字才會(huì)被當(dāng)做true來(lái)處理。
與之對(duì)應(yīng)的全等運(yùn)算符===被稱為嚴(yán)格等于運(yùn)算符,它與等于運(yùn)算符的差別在于它不會(huì)進(jìn)行類(lèi)型轉(zhuǎn)換,也就是說(shuō),只有當(dāng)兩個(gè)值的類(lèi)型相同并且值相等時(shí)返回true,否則返回false。
1 === "1"; // false 0 === "0"; // false true === 1; // false null === undefined; // false
因此,在使用時(shí),我們應(yīng)該優(yōu)先使用===運(yùn)算符。
那么===運(yùn)算符的使用會(huì)不會(huì)帶來(lái)一些細(xì)節(jié)問(wèn)題呢?答案是肯定的。例如,由于JavaScript中false、0和""在條件語(yǔ)句中都會(huì)被轉(zhuǎn)化成false,所以如果使用===時(shí)需要非常謹(jǐn)慎。比如:
if(value === true){ // ... }
如果value是0或者'',那么這個(gè)判斷語(yǔ)句會(huì)返回false。
需要注意的是,typeof運(yùn)算符返回的值可能會(huì)讓一些同學(xué)摸不著頭腦:
typeof null; // 輸出"object" typeof []; // 輸出"object" typeof {}; // 輸出"object" typeof new Date(); // 輸出"object"
對(duì)于以上情況,我們也可以使用全等運(yùn)算符進(jìn)行判斷:
null === null; // 輸出true [] === null; // 輸出false {} === null; // 輸出false
因此,在JS編碼中,不管是==還是===都應(yīng)該多加留意,及時(shí)修復(fù)或改進(jìn)代碼中的錯(cuò)誤,提高代碼的魯棒性。