- 編程與類型系統(tǒng)
- (美)弗拉德·里斯庫迪亞
- 1001字
- 2021-01-29 11:51:25
1.3.2 弱類型與強類型
術(shù)語“強類型”和“弱類型”常被用來描述類型系統(tǒng)。類型系統(tǒng)的強度描述了該系統(tǒng)在實施類型約束時的嚴格程度。弱類型系統(tǒng)會隱式地嘗試將值從其實際類型轉(zhuǎn)換為使用該值時期望的類型。
思考這個問題:牛奶與白色相等嗎?在強類型系統(tǒng)中,這二者不相等,因為牛奶是一種液體,將其與一種顏色進行比較沒有意義。在弱類型系統(tǒng)中,我們可以說“牛奶的顏色是白色的,所以是的,牛奶等于白色”。在強類型系統(tǒng)中,通過讓問題變得像下面這樣更加明確,我們可以顯式地將牛奶轉(zhuǎn)換為顏色:牛奶的顏色等于白色嗎?在弱類型系統(tǒng)中,則不需要這種改進。
JavaScript是弱類型的。通過在TypeScript中使用any類型并讓JavaScript在運行時處理類型,可以看出這一點。JavaScript提供了兩種相等運算符:==檢查兩個值是否相等,===檢查值是否相等,以及值的類型是否相同,如程序清單1.15所示。因為JavaScript是弱類型的,所以"42" == 42這樣的表達式的結(jié)果為true。這一點會讓人感到意外,因為"42"是文本,而42是數(shù)字。
程序清單1.15 弱類型

隱式類型轉(zhuǎn)換很方便,因為我們不必編寫更多代碼來顯式地在類型之間進行轉(zhuǎn)換,但是隱式類型轉(zhuǎn)換也很危險,因為在許多情況中,我們不希望發(fā)生類型轉(zhuǎn)換,但結(jié)果卻讓我們很意外。TypeScript是強類型的。在前面的例子中,如果我們將a聲明為string,將b聲明為number,那么TypeScript將不會編譯上面的比較語句,如程序清單1.16所示。
程序清單1.16 強類型

現(xiàn)在,所有比較都將導致錯誤This condition will always return 'false' since the types 'string' and 'number' have no overlap。類型檢查器發(fā)現(xiàn)我們在試圖比較不同類型的值,所以拒絕編譯代碼。
雖然在短期內(nèi),弱類型系統(tǒng)更容易使用,因為它不要求程序員顯式轉(zhuǎn)換不同類型的值,但是弱類型系統(tǒng)不能提供強類型系統(tǒng)那樣的保證。如果不能正確地實施類型,那么本章描述的大部分優(yōu)點,以及本書剩余部分使用的技術(shù)將失去效用。
注意,雖然一個類型系統(tǒng)要么是動態(tài)的(在運行時進行類型檢查),要么是靜態(tài)的(在編譯時進行類型檢查),但是其強度在一個范圍內(nèi):執(zhí)行的隱式轉(zhuǎn)換越多,該類型系統(tǒng)就越弱。大部分類型系統(tǒng),包括強類型系統(tǒng)在內(nèi),會為其認為安全的轉(zhuǎn)換提供有限的隱式轉(zhuǎn)換。轉(zhuǎn)換為boolean是一個常見的例子:在大多數(shù)語言中,即使a是number類型或者引用類型,if(a)也會編譯。拓寬轉(zhuǎn)換是另一個例子,第4章將會進行介紹。TypeScript只使用number類型表示數(shù)字值,但在其他某些語言中,假如我們需要一個16位的整數(shù),但是傳入了一個8位的整數(shù),那么通常會自動把8位整數(shù)轉(zhuǎn)換為16位整數(shù),因為這種轉(zhuǎn)換不存在數(shù)據(jù)損壞的風險(16位整數(shù)能夠表示8位整數(shù)可以表示的任意值)。
- 復雜軟件設計之道:領域驅(qū)動設計全面解析與實戰(zhàn)
- 程序員面試白皮書
- Android項目開發(fā)入門教程
- MySQL數(shù)據(jù)庫應用與管理 第2版
- Cocos2d-x游戲開發(fā):手把手教你Lua語言的編程方法
- 碼上行動:零基礎學會Python編程(ChatGPT版)
- Flask Web開發(fā)入門、進階與實戰(zhàn)
- ADI DSP應用技術(shù)集錦
- C語言程序設計
- HTML5 APP開發(fā)從入門到精通(微課精編版)
- Android群英傳
- C# Multithreaded and Parallel Programming
- Django 3.0入門與實踐
- Android Development Tools for Eclipse
- Android Game Programming by Example