JavaScript,更廣泛點也許可以說是ECMA Script的各種實作,從誕生到現在,一直就沒斷過争議。ECMA Script 4的夭折正是這些争論嚴重程度的重要展現。
Anyway,不斷争議如何,JavaScript的地位一直不曾被撼動。針對JavaScript存在的問題,可編譯成JavaScript的語言一直就前仆後繼。
這其中,DART,CoffeeScript和TypeScript是其中最有名的三個。
DART由Google推出,設計者是大名鼎鼎的v8引擎作者Lars Bak.
DART很像是一種傳統的面向對象式的語言,比如很像Java。
我們來看個小例子:
怎麼樣?這個文法比ECMA Script 6還需要用constructor()函數用起來更像Java吧?
DART的優勢:
在Google中被廣泛使用
在Fuchsia作業系統中被用來寫應用代碼
文法特别适合Java/C#使用者學習
CoffeeScript是一門以發揚JavaScript的good part的小型語言。作者有比較好的Ruby功底,是以CoffeeScript寫出來有較濃的動态語言的風格。
例:
翻譯成JavaScript代碼,是這樣的:
為了避免使用在JavaScript中比較trick的<code>==</code>操作符,CoffeeScript提供了<code>is</code>操作符來簡化使用<code>===</code>帶來的不快。
另外,為了友善程式員的使用,CoffeeScript提供了yes和on作為true的别名。
這樣的小優化,在CoffeeScript中随處可見。
CoffeeScript的最要優勢之一是Github的編輯器Atom代碼中使用了大量的CoffeeScript。并且Atom的plugin可以使用CoffeeScript開發。
CoffeeScript的方向是更加自由,更像腳本語言一些,跟DART的像傳統語言的方向基本上是背道而馳。
下面,當當當當,我們的主角TypeScript就要出場了。
TypeScript比起Google的Dart絲毫不遜色,因為它也是出自名門,是微軟公司的産品。他的主要負責人可是比Lars Bak成名早得多的大牛Anders Hejlsberg。Anders曾經上司開發了偉大的産品Turbo Pascal,Delphi和.Net及C#.
TypeScript通過tsc工具,将TypeScript轉化為javascript,再執行javascript.
TypeScriptv既然叫Type Script,有類型的腳本語言。我們這一講就從類型說起。
Type Script中第一個不同于其他同類語言的一點是,它支援一個變量可能是多種類型。
比如我們有一個指令行參數,可能是一個字元串,也可能是一個字元串數組。這很好啊,我們就聲明是兩種類型就好了:
既然支援聯合類型了,那麼給靜态檢查就帶來困難了啊。這可如何是好呢?TypeScript提供了類型守護功能,當Type Script能确認在一段代碼中,确定是一個類型之後,就會對它按照這個類型來進行檢查。
比如我們按paras是string的情況來判斷,那麼在這個if塊中,paras就是string.例:
請允許我迫不及待地先介紹非侵入式的類型系統。
非侵入式,也就是說,一個類,實作某個接口,隻要實作了該接口要求的所有方法就可以了,并不需要像Java一樣明确地用implements來進行說明。Go語言中就是這樣做的,TypeScript也是如此,我們看個例子:
Point接口定義了x,y兩個變量。ColorPoint類隻要同樣定義x,y兩個同類型變量,就算是實作了Point接口。在定義變量類型時,就可以用Point做他的類型了。
這樣是不是比DART那樣用extends來寫更有趣一些呢?
不過,這隻是TypeScript的文法糖,我們來看下tsc生成的js代碼,Point直接被無視掉了:
TypeScript支援枚舉類型。從生成的代碼來看,功能還是挺爽的。
例:TypeScript源碼:
生成的JavaScript代碼:
數值類型與JavaScript一樣,隻支援number類型。
數組可以用數組方式寫,也可以用泛型的方式寫:
TypeScript的布爾類型,理論上隻支援true和false。
但是實測下來,賦null和undefined也是可以的。
TypeScript因為最終要生成JavaScript代碼,是以很多都是一些編譯期的檢查。當生成JavaScript代碼時,這些資訊就丢失了。
比如上面布爾型的例子,生成的JavaScript代碼,會把類型資訊全部丢掉:
數值的例子也是一樣:
是以,總結起來,對于基本類型,TypeScript主要是進行編譯期檢查,包括聯合類型和類型守護皆是如此。一旦編譯通過生成JavaScript,這些類型資訊就将全部丢失。