對(duì)我來說,平等就是平等,所以第一次接觸JS中的三個(gè)等號(hào)就很迷茫。大多數(shù)編程語言都有雙等號(hào)“= =”,但沒有三等號(hào)“= = =”。
以下是雙等號(hào)和三等號(hào)之間更正式的區(qū)別:
“如果需要判斷操作數(shù)是否同類型,值是否相等,使用嚴(yán)格相等運(yùn)算符[= = =]。
否則,使用標(biāo)準(zhǔn)的等式運(yùn)算符[= =],它允許您比較兩個(gè)操作數(shù)的值,即使它們是不同的類型。"
- MDN網(wǎng)絡(luò)文檔
認(rèn)為理解它的關(guān)鍵在于理解“類型轉(zhuǎn)換”,這是“動(dòng)態(tài)類型語言”香草Java中的一個(gè)奇怪概念。
之所以有類型轉(zhuǎn)換,是因?yàn)镴S希望防止編程錯(cuò)誤,例如將數(shù)字與字符串進(jìn)行比較:
“在Java中使用雙等號(hào)時(shí),我們是在測(cè)試不精確的等式。雙等號(hào)也帶來了類型轉(zhuǎn)換。
強(qiáng)制轉(zhuǎn)換意味著操作數(shù)只有在轉(zhuǎn)換為相同類型時(shí)才能進(jìn)行比較。"
換句話說,由于類型轉(zhuǎn)換,不同類型的值可以通過= =進(jìn)行比較,但是字符串和數(shù)字永遠(yuǎn)不會(huì)通過= = =嚴(yán)格相等。
例如:
console . log(Number(" 7 ")-7 = = 0);// true
console . log(Number(" 7 ")-7 = = = 0);// true
console . log(Number(" 7 ")-7 = = = Number(" 0 "));// true
console . log(" 7 "-7 = = " 0 ");// true
console . log(" 7 "-7 = = " 0 ");// false
Java中的真與假
在Java中,我們有六個(gè)false值:false、0,“”(空 string)、null、undefined和NaN(不是數(shù)字)。這六個(gè)偽值有什么關(guān)系?
將false、0和“”與(= =)進(jìn)行比較,結(jié)果為真,且不嚴(yán)格相等;Null和undefined只等于它們自己;NaN不等于任何假值,包括它本身?!?/p>
Derek Austin博士對(duì)Java中錯(cuò)誤比較的所有排列
console . log(false = = false);// true
console . log(false = = = false);// true
console . log(false = = 0);// true - false,0和“”大致相等
console . log(false = = = 0);// false
console . log(false = = " ");// true - false,0和“”大致相等
console . log(false = = " ");// false
console . log(false = = null);// false
console . log(false = = = null);// false
console . log(false = = undefined);// false
console . log(false = = = undefined);// false
console . log(false = = NAn);// false
console . log(false = = = NAn);// false
console . log(0 = = 0);// true
console . log(0 = = = 0);// true
console . log(0 = = " ");// true - false,0和“”大致相等
console . log(0 = = " ");// false
console . log(0 = = null);// false
console . log(0 = = = null);// false
console . log(0 = = undefined);// false
console.log(0 ===未定義);// false
console . log(0 = = NAn);// false
console . log(0 = = = NAn);// false
console . log(“= =”);// true
console . log(" = = " = " ");// true
console . log(" = = = null);// false
console . log(" = = " = null);// false
console . log(" = " =未定義);// false
console . log(" = = = undefined);// false
console . log(" = " = NAn);// false
console . log(" = = " = NAn);// false
console . log(null = = null);// true
console . log(null = = = null);// true
console . log(null = = undefined);// true - null大致等于未定義
console.log(null ===未定義);// false
console . log(null = = NAn);// false
console . log(null = = = NAn);// false
console . log(undefined = = undefined);// true
console . log(undefined = = = undefined);// true
console . log(undefined = = NAn);// false
console . log(undefined = = = NAn);// false
console . log(NAn = = NAn);// false - NaN不等于NaN,并且
console . log(NAn = = = NAn);// false - NaN不等于自身
JS中的假值雖然這么精彩,但幸運(yùn)的是,除了這些假值以外的所有值都是真的:
在Java中,真值是在布爾類型的上下文中被認(rèn)為是“真”的所有值。除非定義為false,否則所有值都為true,例如false、0、“”、null、undefined和NaN。
ECMA怎么樣?
如果有興趣,下面是Java使用的具體算法。
嚴(yán)格相等運(yùn)算符
嚴(yán)格相等運(yùn)算符(= = = and!= =)使用嚴(yán)格的等式比較算法來比較兩個(gè)操作數(shù):
11.9.6嚴(yán)格相等比較算法
當(dāng)比較x===y,x和y為值時(shí),表達(dá)式返回true或false,表達(dá)式執(zhí)行如下:
1.如果類型(x)和類型(y)不同,則返回false。
2.如果類型(x)未定義,則返回真。
3.如果類型(x)為空,返回真。
4.如果類型(x)是一個(gè)數(shù)字,那么
→ a .如果x是NaN,則返回false。
→ B .如果y是NaN,則返回false。
→ C .如果x和y的數(shù)值相等,則返回true。
→ D .如果x為+0,y為0,則返回true。
→ e .如果x為0,y為+0,則返回true。
→ F .返回false。
5.如果Type(x)是字符串,如果X和Y中的字符序列完全相同(長度相同,字符位置相同),則返回true;否則,返回false。
6.如果類型(x)是布爾型,如果x和y都為真或假,則返回真;否則,返回false。
7.如果X和Y引用同一個(gè)對(duì)象,返回true;否則,返回false。
注-這個(gè)算法d如果FERS從相同的價(jià)值算法(9.12)在其處理有符號(hào)的零和南數(shù)。
標(biāo)準(zhǔn)等式運(yùn)算符
標(biāo)準(zhǔn)等式運(yùn)算符(= =和!=)使用抽象等式比較算法來比較兩個(gè)操作數(shù):
11.9.3抽象等式比較算法(抽象等式比較算法)
Compare x == y,x和y是值,表達(dá)式返回true或false。表達(dá)式執(zhí)行如下:
1.如果類型(x)與類型(y)相同,則
→ a .如果類型(x)未定義,返回真。
→ B .如果類型(x)為空,則返回真。
→如果類型(x)是一個(gè)數(shù)字,那么
→→→ i .如果x是NaN,則返回false。
→→→ ii。如果y是NaN,則返回false。
→→→ iii。如果x和y的數(shù)值相等,則返回true。
→→→ iv。如果x為+0,y為0,則返回true。
→→→ v .如果x為0,y為+0,則返回true。
→ → vi。返回false。
→ D .如果Type(x)是字符串,如果x和y中的字符序列完全相同(長度相同,字符位置相同),則返回true;否則,返回false。
→ e .如果Type(x)為boolean,如果x和y都為true或false,則返回true;否則,返回false。
→ F .如果x和y指的是同一個(gè)對(duì)象,返回true;否則,返回false。
2.如果x為null,y未定義,則返回true。
3.如果x未定義,y為空,則返回true。
4.如果類型(x)是數(shù)字,類型(y)是字符串,則返回x == ToNumber(y)的結(jié)果。
5.如果類型(x)是字符串,類型(y)是數(shù)字,則返回?cái)?shù)字(x)= y的結(jié)果。
6.如果類型(x)是布爾值,則返回?cái)?shù)字(x)= y的結(jié)果。
7.如果類型(y)是布爾值,則返回x == ToNumber(y)的結(jié)果。
8.如果類型(x)是數(shù)字或字符串,類型(y)是對(duì)象,則返回x == ToPrimitive(y)的結(jié)果。
9.如果類型(x)是對(duì)象,類型(y)是數(shù)字或字符串,則返回Toprimitive(x)= y的結(jié)果。
10.返回false。
注1——鑒于上述平等的定義:
字符串比較可以通過以下方式強(qiáng)制進(jìn)行:“+ a == "" + b”。
可以通過以下方式強(qiáng)制進(jìn)行數(shù)值比較:+a == +b。
布爾比較可以通過以下方式強(qiáng)制執(zhí)行:!a ==!b.
注2 —等式運(yùn)算符維護(hù)以下不變量:
答!= B相當(dāng)于!(A == B)。
A == B相當(dāng)于B == A,除了A和B的求值順序
注3:等式運(yùn)算符不總是可傳遞的。例如,可能有兩個(gè)不同的字符串對(duì)象,每個(gè)對(duì)象代表相同的字符串值;通過==運(yùn)算符,每個(gè)字符串對(duì)象將被視為等于字符串值,但是這兩個(gè)字符串對(duì)象并不相等。例如:
新字符串(“a”)= =“a”和“a”= =新字符串(“a”)均為真。
新字符串(“a”)= =新字符串(“a”)為假。
注4:字符串比較對(duì)代碼單元值序列使用簡單的相等性測(cè)試。沒有嘗試使用在unicode規(guī)范中定義的更復(fù)雜的、面向語義的字符或字符串相等性和排序順序的定義。根據(jù)Unicode標(biāo)準(zhǔn),哪些是標(biāo)準(zhǔn)相等的,哪些是不相等的。實(shí)際上,該算法假設(shè)兩個(gè)字符串都已經(jīng)是規(guī)范化形式。
結(jié)論
一般來說我更喜歡用= = =和!= =,除非必須使用= =和!=,如檢查空的值。
此外,在檢查空的值時(shí),請(qǐng)記住,與雙等號(hào)相比,null和undefined是相等的。
1.《腦殼疼 JS 中令人腦殼疼的 == 與 === 區(qū)別到底是什么? 4字節(jié) 4字節(jié) 今天》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請(qǐng)聯(lián)系頁腳下方聯(lián)系方式。
2.《腦殼疼 JS 中令人腦殼疼的 == 與 === 區(qū)別到底是什么? 4字節(jié) 4字節(jié) 今天》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來源地址,http://f99ss.com/junshi/1146178.html