js文件和ts文件的最大區(qū)別舉例詳解
JavaScript(JS)和 TypeScript(TS)有一些核心的區(qū)別。主要體現(xiàn)在 類型系統(tǒng)、編譯過(guò)程、語(yǔ)言特性 和 開發(fā)體驗(yàn) 等方面。
1.類型系統(tǒng)
JavaScript (JS):
動(dòng)態(tài)類型語(yǔ)言:JavaScript 是動(dòng)態(tài)類型語(yǔ)言,變量的類型在運(yùn)行時(shí)決定。例如,你可以將不同類型的數(shù)據(jù)賦值給同一個(gè)變量,且沒有類型檢查。
let x = 5; // x 是一個(gè)數(shù)字 x = "hello"; // x 現(xiàn)在是一個(gè)字符串
TypeScript (TS):
- 靜態(tài)類型語(yǔ)言:TypeScript 是 JavaScript 的超集,支持靜態(tài)類型檢查。你可以在編寫代碼時(shí)指定變量、函數(shù)等的類型,TypeScript 會(huì)在編譯時(shí)檢查類型錯(cuò)誤。
超集(Superset)是一個(gè)術(shù)語(yǔ),通常用于描述一種語(yǔ)言或概念,它包含了另一個(gè)語(yǔ)言或概念的所有功能和結(jié)構(gòu),并且在其基礎(chǔ)上進(jìn)行了擴(kuò)展或添加了新的特性。
let x: number = 5; // x 被定義為數(shù)字類型 x = "hello"; // 錯(cuò)誤:不能將字符串賦值給數(shù)字類型的變量
通過(guò)靜態(tài)類型,TS 提供了 類型推斷(Type Inference)和 類型注解(Type Annotation),幫助在開發(fā)過(guò)程中捕捉類型錯(cuò)誤。
2.編譯過(guò)程
JavaScript (JS):
- JavaScript 是一種解釋型語(yǔ)言,在瀏覽器或 Node.js 環(huán)境中運(yùn)行時(shí)直接解釋執(zhí)行。沒有編譯過(guò)程,代碼可以直接運(yùn)行。
TypeScript (TS):
TypeScript 需要先 編譯 成 JavaScript 才能執(zhí)行。TypeScript 的源代碼(
.ts文件)會(huì)被轉(zhuǎn)換為標(biāo)準(zhǔn)的 JavaScript(.js文件)。因此,開發(fā)者需要使用 TypeScript 編譯器(tsc)來(lái)將 TS 文件轉(zhuǎn)換為 JS 文件。tsc yourfile.ts
編譯后的 JavaScript 代碼可以在任何支持 JavaScript 的環(huán)境中執(zhí)行。
3.類型推斷和類型注解
JavaScript (JS):
- JavaScript 沒有內(nèi)建的類型系統(tǒng),也就沒有 類型推斷 或 類型注解 的概念。所有類型都由開發(fā)者手動(dòng)控制,且沒有編譯時(shí)類型檢查。
TypeScript (TS):
TypeScript 支持類型推斷和類型注解,這意味著你可以指定變量、函數(shù)參數(shù)、返回值等的類型,并在編譯時(shí)進(jìn)行類型檢查。
類型推斷:如果沒有明確聲明類型,TypeScript 會(huì)自動(dòng)推斷變量的類型。
let x = 5; // 類型推斷為 number let y = "hello"; // 類型推斷為 string
類型注解:開發(fā)者可以明確指定變量的類型。
let name: string = "John"; // 變量 name 被注解為 string 類型
4.面向?qū)ο笾С?/h2>
JavaScript (JS):
- JavaScript 是基于原型(prototype-based)的語(yǔ)言,類和對(duì)象是通過(guò)原型鏈來(lái)實(shí)現(xiàn)的,直到 ES6(ES2015)才正式引入了
class語(yǔ)法。即使有class語(yǔ)法,它也僅僅是語(yǔ)法糖,底層依然是基于原型鏈。
TypeScript (TS):
TypeScript 提供了對(duì) ES6+ 類(
class)的全面支持,同時(shí)還擴(kuò)展了更強(qiáng)大的 面向?qū)ο?/strong> 支持,例如接口(interface)、抽象類(abstract class)、公共和私有成員(public,private),以及訪問(wèn)控制等。class Person { private name: string; constructor(name: string) { this.name = name; } greet() { console.log(`Hello, ${this.name}`); } }接口和類型別名是 TypeScript 提供的額外功能,允許開發(fā)者定義更加嚴(yán)謹(jǐn)?shù)膶?duì)象形態(tài)。
interface Person { name: string; age: number; } const person: Person = { name: "John", age: 30 }; // 強(qiáng)類型檢查
抽象類:不能實(shí)例化的類,提供了一種模板,供子類繼承并實(shí)現(xiàn)抽象方法。
5.類型安全和類型檢查
JavaScript (JS):
- JavaScript 沒有內(nèi)置的類型檢查。開發(fā)者必須自己管理變量的類型,并通過(guò)調(diào)試或測(cè)試來(lái)確保類型的正確性。運(yùn)行時(shí)錯(cuò)誤(如類型錯(cuò)誤)通常是 JavaScript 程序中的一大問(wèn)題。
TypeScript (TS):
TypeScript 提供了靜態(tài)類型檢查,在編譯時(shí)會(huì)檢查類型錯(cuò)誤,這意味著你可以在開發(fā)階段就發(fā)現(xiàn)并修復(fù)潛在的錯(cuò)誤。TypeScript 提供了類型安全,確保類型之間的兼容性,減少了運(yùn)行時(shí)錯(cuò)誤。
function add(a: number, b: number): number { return a + b; } add(1, "2"); // 錯(cuò)誤:第二個(gè)參數(shù)必須是數(shù)字
: number(返回類型):
這個(gè) : number 放在函數(shù)簽名的結(jié)尾,表示 add 函數(shù)的 返回值 的類型是 number。
在這個(gè)函數(shù)中,a + b 會(huì)返回一個(gè)數(shù)字,因此返回值的類型是 number。
如果你嘗試返回一個(gè)非數(shù)字類型的值,TypeScript 會(huì)報(bào)錯(cuò)
6.兼容性
JavaScript (JS):
- JavaScript 是瀏覽器和 Node.js 環(huán)境的標(biāo)準(zhǔn)語(yǔ)言,幾乎所有的 Web 環(huán)境都支持直接執(zhí)行 JS 代碼。
TypeScript (TS):
- TypeScript 是 JavaScript 的超集,所有有效的 JavaScript 代碼在 TypeScript 中都是有效的。這意味著你可以逐步將現(xiàn)有的 JavaScript 項(xiàng)目遷移到 TypeScript。
- TypeScript 代碼必須編譯為 JavaScript,在瀏覽器或 Node.js 中執(zhí)行時(shí),最終還是運(yùn)行 JavaScript。
超集(Superset)描述一種語(yǔ)言或概念,它包含了另一個(gè)語(yǔ)言或概念的所有功能和結(jié)構(gòu),并在其基礎(chǔ)上進(jìn)行了擴(kuò)展或添加了新的特性。
7.開發(fā)體驗(yàn)
JavaScript (JS):
- JavaScript 是靈活且寬容的,沒有強(qiáng)制要求類型或結(jié)構(gòu),適合快速開發(fā)。雖然這帶來(lái)了便利,但也可能導(dǎo)致不易察覺的錯(cuò)誤,增加調(diào)試和維護(hù)的難度。
TypeScript (TS):
- TypeScript 提供了更強(qiáng)的開發(fā)體驗(yàn),尤其是在大型項(xiàng)目中。通過(guò)類型檢查、自動(dòng)完成功能和編輯器集成,開發(fā)者能夠更快發(fā)現(xiàn)錯(cuò)誤,并獲得更好的代碼自動(dòng)補(bǔ)全、重構(gòu)和導(dǎo)航支持。IDE(如 VSCode)對(duì) TypeScript 提供了更強(qiáng)的支持,能極大提高開發(fā)效率。
導(dǎo)航支持(Navigation Support)通常是指在開發(fā)過(guò)程中,尤其是在 集成開發(fā)環(huán)境(IDE) 或 代碼編輯器 中,提供幫助開發(fā)者1.快速定位、2.瀏覽、3.跳轉(zhuǎn)到代碼的不同部分。
8.社區(qū)支持和流行程度
JavaScript (JS):
- JavaScript 是 Web 開發(fā)的標(biāo)準(zhǔn)語(yǔ)言,具有龐大的社區(qū)支持和豐富的庫(kù)、框架(如 React、Vue、Node.js 等)。
TypeScript (TS):
- TypeScript 在近年來(lái)越來(lái)越流行,許多大公司(如 Microsoft、Google、Airbnb)和開源項(xiàng)目(如 Angular、React 等)都選擇了 TypeScript。TypeScript 的學(xué)習(xí)曲線相對(duì)于純 JavaScript 會(huì)稍微陡峭一些,但它帶來(lái)的好處(尤其是在大型項(xiàng)目中的可維護(hù)性和可靠性)是顯而易見的。
比較對(duì)比
| 特性 | JavaScript (JS) | TypeScript (TS) |
|---|---|---|
| 類型系統(tǒng) | 動(dòng)態(tài)類型 | 靜態(tài)類型(支持類型注解和類型推斷) |
| 編譯過(guò)程 | 直接在瀏覽器或 Node.js 環(huán)境運(yùn)行 | 需要編譯為 JavaScript |
| 類型檢查 | 沒有內(nèi)建的類型檢查 | 提供編譯時(shí)類型檢查,捕獲錯(cuò)誤 |
| 面向?qū)ο笾С?/strong> | 基于原型鏈(ES6 引入類語(yǔ)法) | 完全支持面向?qū)ο缶幊?,擴(kuò)展了類、接口、訪問(wèn)控制等功能 |
| 開發(fā)體驗(yàn) | 靈活但容易出錯(cuò) | 更強(qiáng)的編輯器支持和類型檢查,減少運(yùn)行時(shí)錯(cuò)誤 |
| 兼容性 | 所有瀏覽器和 Node.js 都支持直接執(zhí)行 JS | 需要編譯為 JS,兼容現(xiàn)有的 JS 代碼 |
| 流行程度 | 作為 Web 標(biāo)準(zhǔn),具有廣泛的支持 | 逐漸流行,尤其適用于大型項(xiàng)目和開發(fā)團(tuán)隊(duì) |
TS中訪問(wèn)控制主要通過(guò):
1.訪問(wèn)修飾符(Access Modifiers)控制
例如:TypeScript 支持三種主要的訪問(wèn)修飾符:
public:默認(rèn)修飾符,表示屬性或方法可以被類的任何地方訪問(wèn),包括類外部。
private:表示屬性或方法只能在類的內(nèi)部訪問(wèn),外部無(wú)法訪問(wèn)。
protected:表示屬性或方法可以在類內(nèi)部訪問(wèn),同時(shí)也可以在繼承該類的子類中訪問(wèn),但不能在類外部訪問(wèn)。
2.接口(Interface)
TypeScript 的 接口(Interface) 允許你定義類的結(jié)構(gòu)和成員類型,但它本身并沒有提供直接的訪問(wèn)控制功能。你可以通過(guò)接口來(lái)定義對(duì)象的結(jié)構(gòu),并結(jié)合訪問(wèn)修飾符來(lái)實(shí)現(xiàn)控制。
3.枚舉(Enum)
TypeScript 中的 枚舉(Enum) 可以用來(lái)定義一些固定的常量值,例如角色類型、用戶權(quán)限等。在訪問(wèn)控制的實(shí)現(xiàn)中,枚舉類型通常用于限定角色或權(quán)限的范圍。
4.類型保護(hù)和條件訪問(wèn)控制
TypeScript 提供了 類型保護(hù)(Type Guards) 的功能,通過(guò)類型檢查來(lái)執(zhí)行條件訪問(wèn)控制。
總結(jié)
TypeScript 提供了更強(qiáng)的類型安全、工具支持和更好的開發(fā)體驗(yàn),尤其適用于大型項(xiàng)目。
而 JavaScript 則更輕量、靈活,適合快速開發(fā)和小型項(xiàng)目。
到此這篇關(guān)于js文件和ts文件的最大區(qū)別的文章就介紹到這了,更多相關(guān)js文件和ts文件最大區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS實(shí)現(xiàn)圖片預(yù)加載之無(wú)序預(yù)加載功能代碼
這篇文章主要介紹了JS實(shí)現(xiàn)圖片預(yù)加載之無(wú)序預(yù)加載功能代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05
javascript中驗(yàn)證大寫字母、數(shù)字和中文
本文為大家介紹下使用javascript驗(yàn)證大寫字母小寫字母,數(shù)字和中文,具體示例如下2014-01-01
深入理解在JS中通過(guò)四種設(shè)置事件處理程序的方法
所有的JavaScript事件處理程序的作用域是在其定義時(shí)的作用域而非調(diào)用時(shí)的作用域中執(zhí)行,并且它們能存取那個(gè)作用域中的任何一個(gè)本地變量。但是HTML標(biāo)簽屬性注冊(cè)處理程序就是一個(gè)例外??聪旅嫠姆N方式2017-03-03
利用NodeJS和PhantomJS抓取網(wǎng)站頁(yè)面信息以及網(wǎng)站截圖
這篇文章主要介紹了利用NodeJS和PhantomJS抓取網(wǎng)站頁(yè)面信息以及網(wǎng)站截圖的方法,提供實(shí)例代碼供大家參考2013-11-11
javascript實(shí)現(xiàn)瀑布流加載圖片原理
這篇文章主要為大家介紹了javascript實(shí)現(xiàn)瀑布流加載圖片效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02
Rxjs?TakeUntil?操作符內(nèi)容梳理總結(jié)
這篇文章主要介紹了Rxjs?TakeUntil操作符內(nèi)容梳理總結(jié),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06

