最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

TypeScript是什么,與javacript ES6有哪些區(qū)別?

 更新時間:2025年12月20日 10:15:40   作者:Python數(shù)據(jù)分析  
TypeScript是JavaScript的超集,他可以編譯稱純JavaScript.TypeScript可以在任何瀏覽器,任何計算機和操作系統(tǒng)上運行,并且是開源的,TypeScript不是要取代 ES6,而是在ES6基礎(chǔ)上增加類型系統(tǒng),大多數(shù)現(xiàn)代Web開發(fā)React、Vue、Angular等,TypeScript能顯著提高開發(fā)效率和代碼質(zhì)量

概述

如果你關(guān)注JavaScript的新聞和最新趨勢,肯定聽說過被熱炒的ECMAScript 6和ECMAScript 7。ECMAScript跟JavaScript有什么關(guān)系,又有什么不同?
ECMAScript是一種腳本語言規(guī)范。JavaScript是這個規(guī)范的一個實現(xiàn),Jscript和ActionScript也是如此。

ECMAScript 6和ECMAScript 7

我們知道,JavaScript是一種主要在瀏覽器中運行的語言(也可以運行于NodeJS服務(wù)端),每個瀏覽器都可以實現(xiàn)自己版本的JavaScript功能(稍后你將在本書中學(xué)習(xí))。這個具體的實現(xiàn)是基于ECMAScript的。因此,瀏覽器提供的功能大都相同(我們的JavaScript代碼可以在所有瀏覽器中運行);然而,在不同的瀏覽器中,每個功能的行為也會存在細微的差別。

TypeScript

TypeScript是JavaScript的超集,他可以編譯稱純JavaScript.TypeScript可以在任何瀏覽器,任何計算機和操作系統(tǒng)上運行,并且是開源的.

---- 這段話來至于ts官網(wǎng)

核心區(qū)別概述

特性TypeScriptES6 (ES2015+)
類型系統(tǒng)靜態(tài)類型(編譯時檢查)動態(tài)類型(運行時檢查)
超集關(guān)系ES6 的超集,包含所有 ES6 特性TypeScript 的子集
編譯需求需要編譯為 JavaScript現(xiàn)代瀏覽器/Node.js 可直接運行
主要目標(biāo)大型應(yīng)用、企業(yè)級開發(fā)所有 JavaScript 應(yīng)用

TypeScript系統(tǒng)的詳細對比

var / let / const聲明變量

在Es6中引入其他聲明變量的方法,那便是letconst,那么為什么要添加新的聲明方式呢???讓我們看看幾段代碼

var a = 1;
// ~~~
var a = 2;
console.log(a);

上面的代碼是可以完美運行的,而且我們的第一個a變量還會被第二個聲明的a覆蓋,所以我們打印出來的就是2,假如中間寫了很多代碼,而且命名不規(guī)范的情況下,這里可能會有產(chǎn)生很多bug,聽說以前很多問題就是有這個的身影.

let 使用

let a = 1;
// ~~~
let a = 2;     //這里就會報錯
console.log(a);

你會發(fā)現(xiàn),在第二個let a的時候就報錯了,運行也會有報錯

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聲明的變量只在其聲明的塊或子塊中可用,這一點,與var相似。二者之間最主要的區(qū)別在于var聲明的變量的作用域是整個封閉函數(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;

運行結(jié)果

TypeScript和es6的區(qū)別_賦值

變量提升: 可以看到,name打印出來是undefined,而age直接報錯,可見var聲明的變量有變量提升的,let卻沒有
暫時性死區(qū):ES6 明確規(guī)定,如果區(qū)塊中存在 let 和 const 命令,則這個區(qū)塊對這些命令聲明的變量從一開始就形成封閉作用域。只要在聲明之前使用這些變量,就會報錯。這種語法稱為“暫時性死區(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;     // 拋出異常

運行結(jié)果

TypeScript和es6的區(qū)別_賦值_02

模板字面量

說實話,第一眼看到這個的時候,我就喜歡上了它,真的太方便了,以后都不用拼接字符串了

鍵盤位置

在鍵盤的Esc下的第一個按鍵

使用

let message = "什么玩意";
  let logMessage = `
    模板字面量是${message},
    我是第二行了吧
  `;
  console.log(logMessage) // 模板字面量是什么玩意

${}代表里面放的是變量,而且這里面的空格什么的都會保留

運行結(jié)果

TypeScript和es6的區(qū)別_TypeScript和es6的區(qū)別_03

箭頭函數(shù)

聽說JavaScript開發(fā)中有幾大公認(rèn)的難點,如果上面提到的var聲明變量混淆算是一個小難點,那么this指向就是一個大boss,這個問題一直存在現(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);
 };

運行結(jié)果

TypeScript和es6的區(qū)別_TypeScript和es6的區(qū)別_04

使用箭頭函數(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);

運行結(jié)果

TypeScript和es6的區(qū)別_TypeScript和es6的區(qū)別_05

這里的filter方法需要返回一個值,如果返回值是true,就保留這個值,如果是false就過濾掉,會返回一個新數(shù)組,原數(shù)組不變,但是我們看到這個箭頭函數(shù)好像沒有返回一樣,這就是箭頭函數(shù)的第二個特性,如果只有一條語句,可以省略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);

運行結(jié)果

TypeScript和es6的區(qū)別_TypeScript和es6的區(qū)別_06

有時候我們會想要編寫一個動態(tài)參數(shù)的方法,這個時候就可以使用這個符號

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)

運行結(jié)果

TypeScript和es6的區(qū)別_TypeScript和es6的區(qū)別_07

我這樣的一個push方法就支持一個或者多個參數(shù),而不需要把后面的參數(shù)整合成對象,或者數(shù)組,我只是覺得這樣寫更舒服點

乘方運算符

// Es5
const area = 3.14 * Math.pow(r, 2);
// Es6
const area = 3.14 * (r ** r);

模塊

注意:這里面如果你想用HTML來測試模塊的內(nèi)容,需要做兩步

  • script標(biāo)簽上記得加上type="module",不加報錯不能在模塊外部使用import語句
  • 使用服務(wù)器模式打開HTML文件(vscode可以安裝一個Live Server插件,ws可以直接點擊右上角選擇瀏覽器運行),不這樣報錯跨域

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("這個世界");
            console.log(newUtils);
            console.log(newUtils.index);
            console.log(newUtils.good);
            console.log(newUtils.key);
            newUtils.default.test("這個世界");
 </script>

1和2兩種其實是一種,只是1是一個個的導(dǎo)出,而2是一次導(dǎo)出多個,兩種方式隨便那個都可以.我的建議是,如果導(dǎo)出的東西不多,可以用2,當(dāng)導(dǎo)出的內(nèi)容過多了,這個時候?qū)С稣Z句可能在很下面,所以推薦一個一個的導(dǎo)出(個人想法而已)

后面兩種A(export) 和 B(export default)導(dǎo)出有以下幾點注意

  1. export導(dǎo)出的元素,可以使用import {A, B} from "文件地址"引入,這里相當(dāng)于做了一個解構(gòu)賦值(相當(dāng)于導(dǎo)出了一個對象)
  2. export default導(dǎo)出的元素可直接接收,默認(rèn)導(dǎo)出的是個匿名對象,然后需要指定該對象的名字,才可以使用其屬性,這里不能使用解構(gòu)賦值
  3. 第三個導(dǎo)入,直接將內(nèi)部所有的導(dǎo)出都集中到newUtils,打印出來后,你會發(fā)現(xiàn)導(dǎo)出B中的對象放在了newUtilsdefault屬性中了

運行結(jié)果

TypeScript和es6的區(qū)別_賦值_08

改變導(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)注點1 
            console.log(info);             //關(guān)注點2
            utils.test("這個世界");
            console.log(utils.good);
            console.log(utils.newKey);
            console.log(newUtils); 
            console.log(newUtils.newInfo);  //關(guān)注點3
            console.log(newUtils.newIndex); //關(guān)注點4
            newUtils.default.test("這個世界");
 </script>

運行結(jié)果

TypeScript和es6的區(qū)別_賦值_09

改名方式1

good , key都通過 export default導(dǎo)出,但是key卻變了一個名稱newKey,這導(dǎo)致導(dǎo)入使用的時候需要使用新的鍵newKey

改名方式 --- as

  • newInfo , index都通過 export導(dǎo)出,但是index卻變了通過as轉(zhuǎn)為newIndex,這導(dǎo)致導(dǎo)入使用的時候需要使用新的鍵newIndex
  • newInfo 導(dǎo)出的時候為 newInfo,但是我們可以在導(dǎo)入使用的時候使用as關(guān)鍵字,將newInfo 改名為 info

最后還要關(guān)注一下newUtils這個對象,是不是發(fā)現(xiàn)在導(dǎo)出前改名的直接反應(yīng)在這里,但是通過導(dǎo)入時改名并沒有體現(xiàn)出來,當(dāng)然這也是在意料之中的事了

開發(fā)體驗對比

TypeScript 的優(yōu)勢

// 1. 智能提示和自動完成
interface User {
    id: number;
    name: string;
    email: string;
    age?: number;
}

function processUser(user: User) {
    // 輸入 user. 時,IDE 會提示所有可用屬性
    console.log(user.name); // 有智能提示
    // console.log(user.nam); // 編譯時報錯:屬性不存在
}

// 2. 重構(gòu)支持
// 重命名變量、函數(shù)、類時,TypeScript 能安全地更新所有引用

// 3. 代碼文檔化
/**
 * 計算兩個點的距離
 * @param p1 第一個點
 * @param p2 第二個點
 * @returns 兩點間的距離
 */
function calculateDistance(p1: Point, p2: Point): number {
    // 函數(shù)簽名就是文檔
}

// 4. 早期錯誤檢測
const users: User[] = [];
users.push({ name: "張三" }); // 編譯時報錯:缺少 id 和 email

// 5. 更好的協(xié)作
// 類型定義作為團隊間的契約

ES6 的情況

// 1. 運行時錯誤
function processUser(user) {
    console.log(user.name); // 如果 user 是 undefined,運行時崩潰
    console.log(user.nam);  // 拼寫錯誤,運行時返回 undefined
}

// 2. 文檔依賴注釋
/**
 * @param {Object} user - 用戶對象
 * @param {string} user.name - 用戶名
 * @param {string} user.email - 郵箱
 */
function processUser(user) {
    // JSDoc 注釋,但不是強制的
}

編譯與運行

TypeScript 編譯過程

# 安裝 TypeScript
npm install -g typescript

# 編譯 TypeScript
tsc index.ts                    # 編譯單個文件
tsc -p tsconfig.json           # 使用配置文件編譯
tsc --watch                    # 監(jiān)聽模式

# 常用編譯選項
tsc --noEmit                   # 只檢查,不輸出文件
tsc --strict                   # 啟用所有嚴(yán)格檢查
tsc --target ES2020           # 指定目標(biāo)版本

ES6 運行

# 現(xiàn)代瀏覽器直接支持 ES6 模塊
# 在 HTML 中
&lt;script type="module" src="app.js"&gt;&lt;/script&gt;

# Node.js 中(需要 package.json 中設(shè)置 "type": "module")
node app.js

# 或者使用標(biāo)志
node --experimental-modules app.js

適用場景

TypeScript

  • 大型項目:代碼量大,需要更好的維護性

  • 團隊協(xié)作:多人開發(fā),需要明確的接口定義

  • 長期維護:項目生命周期長,需要類型安全

  • 庫/框架開發(fā):提供良好的類型支持給使用者

  • 企業(yè)級應(yīng)用:對代碼質(zhì)量要求高

ES6

  • 小型項目:快速原型,簡單應(yīng)用

  • 腳本工具:一次性腳本,命令行工具

  • 學(xué)習(xí)/教學(xué):避免類型系統(tǒng)的復(fù)雜度

  • 已有項目遷移:逐步引入 TypeScript

  • 性能敏感:避免編譯開銷(雖然很?。?/p>

 總結(jié)

TypeScript 不是要取代 ES6,而是在 ES6 的基礎(chǔ)上增加了類型系統(tǒng)這個強大的工具。選擇使用 TypeScript 還是 ES6,主要取決于:

  • 項目規(guī)模和復(fù)雜度

  • 團隊經(jīng)驗和偏好

  • 維護周期的長短

  • 對代碼質(zhì)量的要求

對于大多數(shù)現(xiàn)代 Web 開發(fā),特別是 React、Vue、Angular 等框架項目,TypeScript 已經(jīng)成為事實上的標(biāo)準(zhǔn),因為它能顯著提高開發(fā)效率和代碼質(zhì)量。

到此這篇關(guān)于TypeScript是什么,與javacript ES6有哪些區(qū)別?的文章就介紹到這了,更多相關(guān)TypeScript與ES6區(qū)別?內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript游戲之是男人就下100層代碼打包

    JavaScript游戲之是男人就下100層代碼打包

    不知不覺,就到了11月份了,其實我為啥要寫js游戲,覺得游戲更能引起共鳴。11月份開篇之作:是男人就下100層,相信大家都玩過。
    2010-11-11
  • JS生態(tài)系統(tǒng)加速探索Draft-js?emoji插件功能及使用探索

    JS生態(tài)系統(tǒng)加速探索Draft-js?emoji插件功能及使用探索

    這篇文章主要介紹了JS生態(tài)系統(tǒng)加速探索Draft-js?emoji插件功能使用探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Javascript Echarts空氣質(zhì)量地圖效果詳解

    Javascript Echarts空氣質(zhì)量地圖效果詳解

    這篇文章主要介紹了詳解Javascript利用echarts畫空氣質(zhì)量地圖,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-10-10
  • JavaScript腳本延遲加載有哪些方式

    JavaScript腳本延遲加載有哪些方式

    本文主要介紹了JavaScript腳本延遲加載有哪些方式,主要介紹了五種方式,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • javascript動畫之模擬拖拽效果篇

    javascript動畫之模擬拖拽效果篇

    其實javascript本身是具有原生拖放功能的,但是由于兼容性問題,以及功能實現(xiàn)的方式,用的不是很廣泛。javascript動畫廣泛使用的還是模擬拖拽。本文將詳細介紹javascript的模擬拖拽,有需要的可以參考借鑒。
    2016-09-09
  • JS無法捕獲滾動條上的mouse up事件的原因猜想

    JS無法捕獲滾動條上的mouse up事件的原因猜想

    當(dāng)用戶鼠標(biāo)在滾動條上按下的時候,我們可以假設(shè)他(她)正在瀏覽聊天內(nèi)容,那么這個時候好的用戶體驗就不能讓滾動條再自動滾動了
    2012-03-03
  • 借助云開發(fā)實現(xiàn)小程序短信驗證碼的發(fā)送

    借助云開發(fā)實現(xiàn)小程序短信驗證碼的發(fā)送

    這篇文章主要介紹了借助云開發(fā)實現(xiàn)小程序短信驗證碼的發(fā)送,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • javascript實現(xiàn)貪吃蛇小練習(xí)

    javascript實現(xiàn)貪吃蛇小練習(xí)

    這篇文章主要為大家詳細介紹了javascript實現(xiàn)貪吃蛇的小練習(xí),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 小程序自定義輪播圖圓點組件

    小程序自定義輪播圖圓點組件

    這篇文章主要為大家詳細介紹了小程序自定義輪播圖圓點組件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • JavaScript阻止回車提交表單的方法

    JavaScript阻止回車提交表單的方法

    如何防止回車(enter)鍵提交表單,其實很簡單,就一句話。onkeydown="if(event.keyCode==13)return false;"把這句寫在from標(biāo)簽里面就好了
    2015-12-12

最新評論

满洲里市| 南溪县| 龙岩市| 长岭县| 泽州县| 海南省| 滕州市| 滕州市| 永新县| 栾城县| 崇信县| 崇信县| 积石山| 宝坻区| 金川县| 定远县| 永宁县| 泸溪县| 哈尔滨市| 佛学| 申扎县| 青冈县| 新乡市| 通州区| 义马市| 共和县| 汤原县| 蓬安县| 新闻| 铜山县| 武城县| 贡嘎县| 元朗区| 长丰县| 滨海县| 平遥县| 绩溪县| 永昌县| 湾仔区| 蒙自县| 凌云县|