作者│Piumi Gunawardhana
譯者│翟珂
JavaScript是深受大眾喜歡的腳本語言。自從它誕生以來,它一直是網(wǎng)絡(luò)開發(fā)的主導(dǎo)語言。20年后,微軟推出了TypeScript,是JavaScript的超集,專為開發(fā)大型網(wǎng)絡(luò)應(yīng)用程序而設(shè)計(jì)。
如果你對(duì)Typescript和JavaScript有所了解,你就會(huì)知道它們不會(huì)相互競(jìng)爭(zhēng)。它們有一種獨(dú)特的關(guān)系,共同發(fā)展。讓我們來分析一下它們的優(yōu)缺點(diǎn),以便將來你能夠更好的為項(xiàng)目選型。
什么是JavaScript?
JavaScript是世界上最流行的編程語言之一。
讓我們從頭講起。自90年代以來,JavaScript一直是網(wǎng)絡(luò)應(yīng)用的核心技術(shù)。它用來與HTML和CSS結(jié)合創(chuàng)建交互式網(wǎng)頁。它是一種具有動(dòng)態(tài)類型和JIT(Just-in-Time)編譯器的高級(jí)語言。
JavaScript是一種多范式語言,支持各種編程風(fēng)格,如函數(shù)式編程、命令式編程和事件驅(qū)動(dòng)式編程。它還支持編寫服務(wù)器端。JavaScript是在ECMAScript(ES)標(biāo)準(zhǔn)的基礎(chǔ)上形成的。在JavaScript中使用最廣泛的ES標(biāo)準(zhǔn)是ES5和ES6。
什么是TypeScript?
TypeScript (TS) 是一個(gè) JavaScript 超集,其目標(biāo)與 JavaScript 相同。
TypeScript 是一種開源編程語言,具有許多特性,如繼承、類、可見性范圍、命名空間、接口、合并和其他現(xiàn)代特性以及靜態(tài)和動(dòng)態(tài)類型。它支持注釋、變量、函數(shù)、語句、模塊和表達(dá)式。
作為一種強(qiáng)類型的編程語言,TypeScript調(diào)試(在編譯過程中)更容易,所以更適用于復(fù)雜應(yīng)用。
為什么會(huì)出現(xiàn) TypeScript?
JavaScript項(xiàng)目的復(fù)雜性呈指數(shù)級(jí)地增長(zhǎng)。最初,JavaScript只被用作客戶端語言。但開發(fā)人員慢慢意識(shí)到,它也可以作為一種服務(wù)器端的編程語言。
盡管JavaScript有很多優(yōu)點(diǎn),但它在服務(wù)器端會(huì)變得混亂和復(fù)雜(特別是對(duì)于大規(guī)模的應(yīng)用程序)。同時(shí),JavaScript還會(huì)使大型復(fù)雜的應(yīng)用程序難以維護(hù)。
而瀏覽器不斷的迭代和跨瀏覽器的兼容性也要求對(duì)底層的JavaScript進(jìn)行改變,但繼續(xù)改造JavaScript來解決這些并不實(shí)際。所以TypeScript應(yīng)運(yùn)而生。
JavaScript 和 TypeScript 之間的主要區(qū)別
JavaScript | TypeScript |
支持動(dòng)態(tài)網(wǎng)頁內(nèi)容 | 為幫助項(xiàng)目解決代碼復(fù)雜性而創(chuàng)建的JavaScript超集 |
解釋性語言,因此只有在運(yùn)行時(shí)才會(huì)發(fā)現(xiàn)錯(cuò)誤 | 在編譯期間可以檢測(cè)和修復(fù)錯(cuò)誤 |
弱類型,無法選擇靜態(tài)類型 | 強(qiáng)類型,支持靜態(tài)和動(dòng)態(tài)類型 |
可以直接在瀏覽器中使用 | 將代碼轉(zhuǎn)換為 JS 以實(shí)現(xiàn)瀏覽器兼容性 |
不支持模塊、泛型和接口 | 支持模塊、泛型和接口 |
不支持可選參數(shù) | 可選參數(shù)可以添加到函數(shù)中 |
使用數(shù)字和字符串作為接口 | 數(shù)字和字符串是對(duì)象 |
大量社區(qū)支持,包括大量文檔 | 社區(qū)支持正在增長(zhǎng),不像以前那么強(qiáng)大 |
不支持原型設(shè)計(jì) | 原型設(shè)計(jì)是一個(gè)可行的選擇 |
不需要事先的腳本知識(shí) | 學(xué)習(xí)和編碼需要時(shí)間,需要腳本知識(shí) |
無需設(shè)置構(gòu)建環(huán)境 | 對(duì)于靜態(tài)類型定義,需要適當(dāng)?shù)貥?gòu)建設(shè)置(npm 包) |
TypeScript 比 JavaScript 更好嗎?
根據(jù)我的描述,TypeScript似乎只是JS的一個(gè)更好的版本。所以你可能會(huì)認(rèn)為TS會(huì)在不久的將來取代JavaScript。其實(shí)不然,我仍然相信JavaScript會(huì)有用武之地。
復(fù)雜性是一個(gè)需要考慮的關(guān)鍵因素。
JavaScript 非常適合更簡(jiǎn)單的應(yīng)用程序,因?yàn)樗梢栽谒衅脚_(tái)(跨平臺(tái))上運(yùn)行并且非常輕量級(jí)。另外,與JS的最小開銷相比,編譯TS代碼需要的時(shí)間和CPU資源對(duì)項(xiàng)目而言會(huì)更麻煩。
與JavaScript相比,TypeScript有很多好處。
TS 使代碼重構(gòu)變得更加容易,并且更強(qiáng)調(diào)顯式類型,使開發(fā)人員能夠掌握各種組件的交互方式。由于它支持編譯時(shí)調(diào)試,對(duì)于處理大型復(fù)雜應(yīng)用程序的團(tuán)隊(duì)來說,有一定的好處。
為任何項(xiàng)目設(shè)置TypeScript都是容易的。一些框架,如Angular,默認(rèn)使用TypeScript。因此,在我看來TypeScript更勝一籌。
TypeScript 的缺點(diǎn)
盡管TypeScript有許多優(yōu)點(diǎn),但它也有某些缺點(diǎn)。
需要準(zhǔn)確的定義類型,在使用的時(shí)候是比較麻煩的,但從長(zhǎng)遠(yuǎn)來看,可以節(jié)省時(shí)間和資源。這是選擇JavaScript的最常用的理由。
你不可能把一個(gè)大型的JavaScript項(xiàng)目遷移到嚴(yán)格的TypeScript上。雖然有一些工具可以協(xié)助,但你還是需要自己遷移大部分的代碼。
TypeScript代碼編譯需要時(shí)間和CPU資源,所以需要等待一會(huì)才能看到改變。與傳統(tǒng)的JavaScript不同,實(shí)時(shí)編碼會(huì)有一點(diǎn)影響。在海量代碼庫上,這些工具也會(huì)顯著減慢,導(dǎo)致導(dǎo)航等顯著延遲。
什么時(shí)候應(yīng)該將項(xiàng)目遷移到TypeScript?
當(dāng)代碼的大小、復(fù)雜性和出錯(cuò)率增加時(shí),需要在編譯過程中確定具體問題時(shí),就可以使用TypeScript。
TypeScript 還具有接口和訪問修飾符,允許開發(fā)人員在單個(gè)代碼庫上進(jìn)行協(xié)作和交互。因此,最好在項(xiàng)目一開始就使用TypeScript。
但是你如果喜歡像Ember.js或Glimmer.js這樣的框架,那你就不會(huì)喜歡TypeScript,這些框架的首選是JavaScript。
結(jié)論
由于 TypeScript 轉(zhuǎn)換為普通的 JavaScript 代碼,因此你可以將其用作 JavaScript 的替代品。這就是為什么它更容易被接受。當(dāng)然我們也能看到TS被集成到流行的JS框架的核心構(gòu)建組件和庫中,如Angular、React和Vue.js。
就個(gè)人而言,我是TypeScript的粉絲,通常建議新項(xiàng)目使用它。在開始的時(shí)候多花點(diǎn)心思,就省得以后頭疼了。
我希望這篇文章能夠幫助你更好地理解這兩種腳本語言之間的差異。至少,你已經(jīng)對(duì)TypeScript到底是什么有了更好的了解?,F(xiàn)在你可以為你的下一個(gè)項(xiàng)目作出更明智的選擇了。
譯者介紹
翟珂,51CTO社區(qū)編輯,目前在杭州從事軟件研發(fā)工作,做過電商、征信等方面的系統(tǒng),享受分享知識(shí)的過程,充實(shí)自己的生活。
原文標(biāo)題:Still pretending you know the differences between JavaScript and Typescript?
?? https://thenextweb.com/news/differences-between-javascript-and-typescript??