TypeScript是什么,與javacript ES6有哪些區(qū)別?
概述
如果你關(guān)注JavaScript的新聞和最新趨勢,肯定聽說過被熱炒的ECMAScript 6和ECMAScript 7。ECMAScript跟JavaScript有什么關(guān)系,又有什么不同?
ECMAScript是一種腳本語言規(guī)范。JavaScript是這個(gè)規(guī)范的一個(gè)實(shí)現(xiàn),Jscript和ActionScript也是如此。
ECMAScript 6和ECMAScript 7
我們知道,JavaScript是一種主要在瀏覽器中運(yùn)行的語言(也可以運(yùn)行于NodeJS服務(wù)端),每個(gè)瀏覽器都可以實(shí)現(xiàn)自己版本的JavaScript功能(稍后你將在本書中學(xué)習(xí))。這個(gè)具體的實(shí)現(xiàn)是基于ECMAScript的。因此,瀏覽器提供的功能大都相同(我們的JavaScript代碼可以在所有瀏覽器中運(yùn)行);然而,在不同的瀏覽器中,每個(gè)功能的行為也會存在細(xì)微的差別。
TypeScript
TypeScript是JavaScript的超集,他可以編譯稱純JavaScript.TypeScript可以在任何瀏覽器,任何計(jì)算機(jī)和操作系統(tǒng)上運(yùn)行,并且是開源的.
---- 這段話來至于ts官網(wǎng)
核心區(qū)別概述
| 特性 | TypeScript | ES6 (ES2015+) |
|---|---|---|
| 類型系統(tǒng) | 靜態(tài)類型(編譯時(shí)檢查) | 動態(tài)類型(運(yùn)行時(shí)檢查) |
| 超集關(guān)系 | ES6 的超集,包含所有 ES6 特性 | TypeScript 的子集 |
| 編譯需求 | 需要編譯為 JavaScript | 現(xiàn)代瀏覽器/Node.js 可直接運(yùn)行 |
| 主要目標(biāo) | 大型應(yīng)用、企業(yè)級開發(fā) | 所有 JavaScript 應(yīng)用 |
TypeScript系統(tǒng)的詳細(xì)對比
var / let / const聲明變量
在Es6中引入其他聲明變量的方法,那便是let和const,那么為什么要添加新的聲明方式呢???讓我們看看幾段代碼
var a = 1; // ~~~ var a = 2; console.log(a);
上面的代碼是可以完美運(yùn)行的,而且我們的第一個(gè)a變量還會被第二個(gè)聲明的a覆蓋,所以我們打印出來的就是2,假如中間寫了很多代碼,而且命名不規(guī)范的情況下,這里可能會有產(chǎn)生很多bug,聽說以前很多問題就是有這個(gè)的身影.
let 使用
let a = 1; // ~~~ let a = 2; //這里就會報(bào)錯(cuò) console.log(a);
你會發(fā)現(xiàn),在第二個(gè)let a的時(shí)候就報(bào)錯(cuò)了,運(yùn)行也會有報(bào)錯(cuò)
var x = 'global'; let y = 'global'; console.log(this.x); // "global" console.log(this.y); // undefined
var 申明的變量會綁定到全局變量上,至少是當(dāng)前對象上,而let不會
function varTest() {
var x = 1;
{
var x = 2; // 同樣的變量!
console.log(x); // 2
}
console.log(x); // 2
}
function letTest() {
let x = 1;
{
let x = 2; // 不同的變量
console.log(x); // 2
}
console.log(x); // 1
}let聲明的變量只在其聲明的塊或子塊中可用,這一點(diǎn),與var相似。二者之間最主要的區(qū)別在于var聲明的變量的作用域是整個(gè)封閉函數(shù)。注意:這里是用{}圍成的子塊,以下情況是一樣的打印結(jié)果
function varTest() {
var x = 1;
function test() {
var x = 2; // 不同的變量
console.log(x); // 2
}
test();
console.log(x); // 1
}
function letTest() {
let x = 1;
function test() {
let x = 2; // 不同的變量
console.log(x); // 2
}
test();
console.log(x); // 1
}console.log(name); console.log(age); var name = "測試"; let age = 18;
運(yùn)行結(jié)果

變量提升: 可以看到,name打印出來是undefined,而age直接報(bào)錯(cuò),可見var聲明的變量有變量提升的,let卻沒有
暫時(shí)性死區(qū):ES6 明確規(guī)定,如果區(qū)塊中存在 let 和 const 命令,則這個(gè)區(qū)塊對這些命令聲明的變量從一開始就形成封閉作用域。只要在聲明之前使用這些變量,就會報(bào)錯(cuò)。這種語法稱為“暫時(shí)性死區(qū)”(temporal dead zone,簡稱TDZ)。
const使用
const聲明的為常量,只讀,不可修.(不可修的僅僅是引用地址不可以變而已,但是引用地址內(nèi)部變化是可以的),怎么理解呢!!!
const a = 0;
const b = {
c: 0,
d: 1
}
b.c = 15; // 沒有問題
b = 14; // 拋出異常
a = 12; // 拋出異常運(yùn)行結(jié)果

模板字面量
說實(shí)話,第一眼看到這個(gè)的時(shí)候,我就喜歡上了它,真的太方便了,以后都不用拼接字符串了
鍵盤位置
在鍵盤的Esc下的第一個(gè)按鍵
使用
let message = "什么玩意";
let logMessage = `
模板字面量是${message},
我是第二行了吧
`;
console.log(logMessage) // 模板字面量是什么玩意${}代表里面放的是變量,而且這里面的空格什么的都會保留
運(yùn)行結(jié)果

箭頭函數(shù)
聽說JavaScript開發(fā)中有幾大公認(rèn)的難點(diǎn),如果上面提到的var聲明變量混淆算是一個(gè)小難點(diǎn),那么this指向就是一個(gè)大boss,這個(gè)問題一直存在現(xiàn)代編程中,但是箭頭函數(shù)的出現(xiàn),解決了絕大多數(shù)的this指向問題
this指向保持不變
// 圖片地址
let img_url = "https://upload-images.jianshu.io/upload_images/13962818-8ab62dc051112573.jpg";
// 創(chuàng)建對象
let img = new Image();
// 改變圖片的src
img.src = img_url;
// 加載完成執(zhí)行
img.onload = function () {
// 打印
console.dir(this);
};
// 創(chuàng)建對象
let img1 = new Image();
// 改變圖片的src
img1.src = img_url;
// 加載完成執(zhí)行
img1.onload = () => {
// 打印
console.log(this);
};運(yùn)行結(jié)果

使用箭頭函數(shù)的時(shí)候,this還是指向外部的window對象,而普通函數(shù)的this指向調(diào)用者(這里的調(diào)用者是img對象)
如果只有一條語句,可以省掉return
let arr = [1, 2, 3, 4, 5, 6, 7]; let filterArr = arr.filter((item) => item % 2 === 0); console.log(arr, filterArr);
運(yùn)行結(jié)果

這里的filter方法需要返回一個(gè)值,如果返回值是true,就保留這個(gè)值,如果是false就過濾掉,會返回一個(gè)新數(shù)組,原數(shù)組不變,但是我們看到這個(gè)箭頭函數(shù)好像沒有返回一樣,這就是箭頭函數(shù)的第二個(gè)特性,如果只有一條語句,可以省略return
函數(shù)的參數(shù)默認(rèn)值
function sum(x = 1, y = 2, z = 3){
return x + y + z;
}
sum(); // 6
sum(2 , 3); // 8聲明展開和剩余參數(shù)
let params = [1,2,3]; console.log(...params);
運(yùn)行結(jié)果

有時(shí)候我們會想要編寫一個(gè)動態(tài)參數(shù)的方法,這個(gè)時(shí)候就可以使用這個(gè)符號
function push(targetArr, ...nums){
for(let i = 0,len = nums.length; i < len; i++){
targetArr.push(nums[0]);
}
}
let arr = [];
push(arr, 12, 45);
console.log(arr)運(yùn)行結(jié)果

我這樣的一個(gè)push方法就支持一個(gè)或者多個(gè)參數(shù),而不需要把后面的參數(shù)整合成對象,或者數(shù)組,我只是覺得這樣寫更舒服點(diǎn)
乘方運(yùn)算符
// Es5 const area = 3.14 * Math.pow(r, 2); // Es6 const area = 3.14 * (r ** r);
模塊
注意:這里面如果你想用HTML來測試模塊的內(nèi)容,需要做兩步
script標(biāo)簽上記得加上type="module",不加報(bào)錯(cuò)不能在模塊外部使用import語句- 使用服務(wù)器模式打開
HTML文件(vscode可以安裝一個(gè)Live Server插件,ws可以直接點(diǎn)擊右上角選擇瀏覽器運(yùn)行),不這樣報(bào)錯(cuò)跨域
index.js
// 1
export const index = 5555;
const key = "key";
const good = 1234;
// 2 A
export {
key,good
}
// B
export default {
test :function(params) {
console.log(params)
}
}測試html
<script type="module">
import { index } from "./index.js"; //導(dǎo)入1
import utils from "./index.js"; //導(dǎo)入2
import * as newUtils from "./index.js";//導(dǎo)入3
console.log(index);
console.log(newGood);
console.log(newKey);
utils.test("這個(gè)世界");
console.log(newUtils);
console.log(newUtils.index);
console.log(newUtils.good);
console.log(newUtils.key);
newUtils.default.test("這個(gè)世界");
</script>1和2兩種其實(shí)是一種,只是1是一個(gè)個(gè)的導(dǎo)出,而2是一次導(dǎo)出多個(gè),兩種方式隨便那個(gè)都可以.我的建議是,如果導(dǎo)出的東西不多,可以用2,當(dāng)導(dǎo)出的內(nèi)容過多了,這個(gè)時(shí)候?qū)С稣Z句可能在很下面,所以推薦一個(gè)一個(gè)的導(dǎo)出(個(gè)人想法而已)
后面兩種A(
export) 和 B(export default)導(dǎo)出有以下幾點(diǎn)注意
export導(dǎo)出的元素,可以使用import {A, B} from "文件地址"引入,這里相當(dāng)于做了一個(gè)解構(gòu)賦值(相當(dāng)于導(dǎo)出了一個(gè)對象)export default導(dǎo)出的元素可直接接收,默認(rèn)導(dǎo)出的是個(gè)匿名對象,然后需要指定該對象的名字,才可以使用其屬性,這里不能使用解構(gòu)賦值- 第三個(gè)導(dǎo)入,直接將內(nèi)部所有的導(dǎo)出都集中到
newUtils,打印出來后,你會發(fā)現(xiàn)導(dǎo)出B中的對象放在了newUtils的default屬性中了
運(yùn)行結(jié)果

改變導(dǎo)出的名稱
index.js
const index = 5555;
const newInfo = 4444;
const key = "key";
const good = 1234;
export {
newInfo,
index as newIndex
}
export default {
newKey :key,
good,
test :function(params) {
console.log(params)
}
}<script type="module">
import { newIndex, newInfo as info } from "./index.js";
import utils from "./index.js";
import * as newUtils from "./index.js";
console.log(newIndex); //關(guān)注點(diǎn)1
console.log(info); //關(guān)注點(diǎn)2
utils.test("這個(gè)世界");
console.log(utils.good);
console.log(utils.newKey);
console.log(newUtils);
console.log(newUtils.newInfo); //關(guān)注點(diǎn)3
console.log(newUtils.newIndex); //關(guān)注點(diǎn)4
newUtils.default.test("這個(gè)世界");
</script>運(yùn)行結(jié)果

改名方式1
good , key都通過 export default導(dǎo)出,但是key卻變了一個(gè)名稱newKey,這導(dǎo)致導(dǎo)入使用的時(shí)候需要使用新的鍵newKey
改名方式 --- as
newInfo,index都通過export導(dǎo)出,但是index卻變了通過as轉(zhuǎn)為newIndex,這導(dǎo)致導(dǎo)入使用的時(shí)候需要使用新的鍵newIndexnewInfo導(dǎo)出的時(shí)候?yàn)?newInfo,但是我們可以在導(dǎo)入使用的時(shí)候使用as關(guān)鍵字,將newInfo改名為info
最后還要關(guān)注一下newUtils這個(gè)對象,是不是發(fā)現(xiàn)在導(dǎo)出前改名的直接反應(yīng)在這里,但是通過導(dǎo)入時(shí)改名并沒有體現(xiàn)出來,當(dāng)然這也是在意料之中的事了
開發(fā)體驗(yàn)對比
TypeScript 的優(yōu)勢
// 1. 智能提示和自動完成
interface User {
id: number;
name: string;
email: string;
age?: number;
}
function processUser(user: User) {
// 輸入 user. 時(shí),IDE 會提示所有可用屬性
console.log(user.name); // 有智能提示
// console.log(user.nam); // 編譯時(shí)報(bào)錯(cuò):屬性不存在
}
// 2. 重構(gòu)支持
// 重命名變量、函數(shù)、類時(shí),TypeScript 能安全地更新所有引用
// 3. 代碼文檔化
/**
* 計(jì)算兩個(gè)點(diǎn)的距離
* @param p1 第一個(gè)點(diǎn)
* @param p2 第二個(gè)點(diǎn)
* @returns 兩點(diǎn)間的距離
*/
function calculateDistance(p1: Point, p2: Point): number {
// 函數(shù)簽名就是文檔
}
// 4. 早期錯(cuò)誤檢測
const users: User[] = [];
users.push({ name: "張三" }); // 編譯時(shí)報(bào)錯(cuò):缺少 id 和 email
// 5. 更好的協(xié)作
// 類型定義作為團(tuán)隊(duì)間的契約ES6 的情況
// 1. 運(yùn)行時(shí)錯(cuò)誤
function processUser(user) {
console.log(user.name); // 如果 user 是 undefined,運(yùn)行時(shí)崩潰
console.log(user.nam); // 拼寫錯(cuò)誤,運(yùn)行時(shí)返回 undefined
}
// 2. 文檔依賴注釋
/**
* @param {Object} user - 用戶對象
* @param {string} user.name - 用戶名
* @param {string} user.email - 郵箱
*/
function processUser(user) {
// JSDoc 注釋,但不是強(qiáng)制的
}編譯與運(yùn)行
TypeScript 編譯過程
# 安裝 TypeScript npm install -g typescript # 編譯 TypeScript tsc index.ts # 編譯單個(gè)文件 tsc -p tsconfig.json # 使用配置文件編譯 tsc --watch # 監(jiān)聽模式 # 常用編譯選項(xiàng) tsc --noEmit # 只檢查,不輸出文件 tsc --strict # 啟用所有嚴(yán)格檢查 tsc --target ES2020 # 指定目標(biāo)版本
ES6 運(yùn)行
# 現(xiàn)代瀏覽器直接支持 ES6 模塊 # 在 HTML 中 <script type="module" src="app.js"></script> # Node.js 中(需要 package.json 中設(shè)置 "type": "module") node app.js # 或者使用標(biāo)志 node --experimental-modules app.js
適用場景
TypeScript
大型項(xiàng)目:代碼量大,需要更好的維護(hù)性
團(tuán)隊(duì)協(xié)作:多人開發(fā),需要明確的接口定義
長期維護(hù):項(xiàng)目生命周期長,需要類型安全
庫/框架開發(fā):提供良好的類型支持給使用者
企業(yè)級應(yīng)用:對代碼質(zhì)量要求高
ES6
小型項(xiàng)目:快速原型,簡單應(yīng)用
腳本工具:一次性腳本,命令行工具
學(xué)習(xí)/教學(xué):避免類型系統(tǒng)的復(fù)雜度
已有項(xiàng)目遷移:逐步引入 TypeScript
性能敏感:避免編譯開銷(雖然很?。?/p>
總結(jié)
TypeScript 不是要取代 ES6,而是在 ES6 的基礎(chǔ)上增加了類型系統(tǒng)這個(gè)強(qiáng)大的工具。選擇使用 TypeScript 還是 ES6,主要取決于:
項(xiàng)目規(guī)模和復(fù)雜度
團(tuán)隊(duì)經(jīng)驗(yàn)和偏好
維護(hù)周期的長短
對代碼質(zhì)量的要求
對于大多數(shù)現(xiàn)代 Web 開發(fā),特別是 React、Vue、Angular 等框架項(xiàng)目,TypeScript 已經(jīng)成為事實(shí)上的標(biāo)準(zhǔn),因?yàn)樗茱@著提高開發(fā)效率和代碼質(zhì)量。
到此這篇關(guān)于TypeScript是什么,與javacript ES6有哪些區(qū)別?的文章就介紹到這了,更多相關(guān)TypeScript與ES6區(qū)別?內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一文詳解TypeScript跟js、es6這些的區(qū)別
- JavaScript與TypeScript的區(qū)別與聯(lián)系詳解
- 如何將JavaScript(JS)代碼轉(zhuǎn)換為TypeScript(TS)的注意事項(xiàng)詳解
- 一文讓你徹底搞懂TypeScript(TS)和JavaScript(JS)區(qū)別與聯(lián)系
- 全面解讀TypeScript和JavaScript的區(qū)別
- 詳解JavaScript到TypeScript的轉(zhuǎn)換過程
- TypeScript與JavaScript的區(qū)別分析
- 解讀TypeScript與JavaScript的區(qū)別
相關(guān)文章
js中回調(diào)函數(shù)的學(xué)習(xí)筆記
這篇文章主要介紹了js中回調(diào)函數(shù)的相關(guān)知識,需要的朋友可以參考下2014-07-07
實(shí)例分析JS與Node.js中的事件循環(huán)
本篇文章通過實(shí)例給大家詳細(xì)分析了JS與Node.js中的事件的原理以及用法,大家學(xué)習(xí)一下吧。2017-12-12
Javascript hasOwnProperty 方法 & in 關(guān)鍵字
hasOwnProperty :如果 object 具有指定名稱的屬性,那么方法返回 true;反之則返回 false。2008-11-11
基于原生JavaScript實(shí)現(xiàn)SPA單頁應(yīng)用
單頁Web應(yīng)用?(single?page?web?application,SPA)?,就是只有一張Web頁面的應(yīng)用,是加載單個(gè)HTML?頁面并在用戶與應(yīng)用程序交互時(shí)動態(tài)更新該頁面的Web應(yīng)用程序。本文將利用原生JS實(shí)現(xiàn)SPA單頁應(yīng)用,需要的可以參考一下2023-03-03
一文掌握J(rèn)avaScript數(shù)組常用工具函數(shù)總結(jié)
這篇文章主要介紹了一文掌握J(rèn)avaScript數(shù)組常用工具函數(shù)總結(jié),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值2022-06-06
小程序animate動畫實(shí)現(xiàn)直播間點(diǎn)贊
這篇文章主要為大家詳細(xì)介紹了小程序animate動畫實(shí)現(xiàn)直播間點(diǎn)贊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
BootStrap Table實(shí)現(xiàn)server分頁序號連續(xù)顯示功能(當(dāng)前頁從上一頁的結(jié)束序號開始)
這篇文章主要介紹了BootStrap Table實(shí)現(xiàn)server分頁序號連續(xù)顯示功能(當(dāng)前頁從上一頁的結(jié)束序號開始),需要的朋友可以參考下2017-09-09
Javascript實(shí)現(xiàn)基本運(yùn)算器
這篇文章主要為大家詳細(xì)介紹了Javascript實(shí)現(xiàn)基本運(yùn)算器的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07

