讓我們從一個(gè)簡短的介紹類型系統(tǒng)開始,我認(rèn)為這將幫助您理解類型強(qiáng)制的一般概念。
語言的類型系統(tǒng)定義了規(guī)則,這些規(guī)則告訴我們在該語言中存在哪些類型的數(shù)據(jù),以及如何使用不同的運(yùn)算符組合它們。例如,其中一條規(guī)則可能指定加號(+)運(yùn)算符僅對數(shù)字起作用。這些規(guī)則的存在主要是為了防止你朝自己的腳開槍。但是,當(dāng)程序員在程序中違反這個(gè)規(guī)則時(shí)會發(fā)生什么呢?沒有什么能阻止程序員輸入{} + {}
或“hello” + 5
在一個(gè)程序中,即使語言認(rèn)為這些表達(dá)沒有任何意義。
在這些情況下最終會發(fā)生什么取決于語言對其類型規(guī)則的嚴(yán)格程度。
語言類型系統(tǒng)通常持有兩種觀點(diǎn)中的一種,即你違反了它的規(guī)則:
- 說“嘿,這可不酷!”并立即使你的程序崩潰。
- 說“我不能用{}…做任何事但是我可以用數(shù)字來做一些事情“并嘗試將{}轉(zhuǎn)換成一個(gè)數(shù)字。
對其規(guī)則采取第一立場的類型系統(tǒng)的語言通常被稱為“強(qiáng)類型”語言。他們嚴(yán)格不讓你違反規(guī)則。采用第二種方法(如JavaScript)的語言被稱為“弱類型”或“松散類型”語言。當(dāng)然,您可以違反規(guī)則,但當(dāng)它強(qiáng)制轉(zhuǎn)換您在程序中描述的數(shù)據(jù)類型以符合其規(guī)則時(shí),不要感到驚訝。這種行為稱為…(鼓卷).。類型強(qiáng)制.
現(xiàn)在讓我們看看JavaScript中的一些例子。首先,讓我們從一個(gè)不會導(dǎo)致類型強(qiáng)制的表達(dá)式開始。
5 + 5
使用帶有兩個(gè)數(shù)字的+運(yùn)算符,這是完全有效的。該程序?qū)⑻幚?的意思是“添加”,并高興地添加這兩個(gè)數(shù)字。不需要轉(zhuǎn)換。
但是…呢?
[] + 5
哦。在JavaScript中,+
可以表示添加兩個(gè)數(shù)字或連接兩個(gè)字符串。在這種情況下,我們既沒有兩個(gè)數(shù)字,也沒有兩個(gè)字符串。我們只有一個(gè)數(shù)字和一個(gè)對象。根據(jù)JavaScript的類型規(guī)則,這是沒有邏輯意義的。因?yàn)樗從氵`反了它的規(guī)則,而不是崩潰,它試圖使它的意義無論如何。那么JavaScript是做什么的呢?嗯,它知道如何連接字符串,所以它將[]和5轉(zhuǎn)換成字符串,結(jié)果是字符串值“5”。
比較操作符是怎么處理的?==
和===
?為什么有兩個(gè)比較操作符?
==
不受JavaScript類型轉(zhuǎn)換行為的影響。表達(dá)式,如5 == “5”
將計(jì)算為true,因?yàn)镴avaScript將嘗試轉(zhuǎn)換其中之一,以便比較相同類型的數(shù)據(jù)。
在許多情況下,這是不可取的,因?yàn)槟赡芟胫滥容^的某些數(shù)據(jù)是否具有不同的類型,這樣您就可以決定如何處理它。那是===
接線員進(jìn)來。當(dāng)你使用===
,則不會發(fā)生類型轉(zhuǎn)換。因此,表達(dá)5 === “5”
會被評估為假的。