首頁>技術>

本節我們講變數的宣告,變數從字面意思來理解,就是可以改變的量。而從程式設計角度來說,變數就是記憶體中的名稱空間,主要用於儲存值,我們可以把它理解為程式中值的容器。

我們知道 TypeScript 有一個特定就是變數是強型別的,也就是說在宣告變數的時候必須給這個變數指定一個型別。這與 JavaScript 不同, JavaScript 是弱型別語言,在 JavaScript 中宣告變數時不需要指定型別。

宣告變數的方式

在 JavaScript 中可以透過關鍵字 var 、 let 、 const 來宣告變數,當然 TypeScript 中同樣也可以。

這三種宣告變數的方式各有不同,如下所示:

使用 var 關鍵字宣告變數,其作用於為該語句所在的函式內, 且存在變數提升現象。let 的宣告類似於 var,但是它的作用域為該語句所在的程式碼塊內,不存在變數提升。注意它們一個是函式內,一個是程式碼塊內,程式碼塊就是直接使用 {} 括起來的程式碼。const 是 let 的一個擴充套件,它可以防止重新分配變數,一般用來宣告常量,在後面出現的程式碼中不能再修改常量的值。變數命名規則

在講如何宣告變數之前,我們先來看一下 TypeScript 的變數命名規則,如下所示:

變數名稱可以包含數字、字母、下劃線 _ 和美元 $ 符號,其他都不可以,例如 a、abc、AA、a_ 都符合命名規範。變數名不能以數字作為開頭,例如 7a 就不符合變數的命名規範,而 a7 是可以的。使用關鍵字 var 宣告變數

首先在 JavaScript 語言中我們都是使用關鍵字 var 來宣告變數的。那麼為什麼在 TypeScript 中我們更偏向於使用 let,下面我們會講到原因。

在 TypeScript 中宣告變數其實就和 JavaScript 很類似。但因為一個是強型別語言一個是弱型別語言,所以兩者在宣告變數的格式上會有一些不同。

在 TypeScript 中宣告變數,一共有四種方式:

第一種,宣告變數的型別及初始值,需要在變數名後面加上變數 : 和變數型別:
var [變數名] : [型別] = 值;// 例如var a : number = 1;
第二種,宣告變數的型別,但是不賦初始值。在這種情況下,該變數的值預設為 undefined:
var [變數名] : [型別];// 例如var a:number;
第三種,宣告變數並賦初始值,但不宣告型別,此時變數型別將被設定為any(任意型別),這種宣告方式和 JavaScript 中的類似:
var [變數名] = 值;// 例如 var a = 1;
第四種,不宣告變數型別,且不賦初始值。在這種情況下,變數的資料型別為 any,初始化值為 undefined:
var [變數名];// 例如var a;

示例:

例如我們用 4 種不同的方式分別宣告 4 個不同的變數,並且輸出它們的值:

// 第一種var a:number = 100;console.log(a);  // 第二種var b:string;b = 'xkd';console.log(b);  // 第三種var c = true;console.log(c);  // 第四種var d;d = [1, 2, 3];console.log(d);  

使用 tsc test.ts 命令編譯後會得到如下 JavaScript 程式碼:

// 第一種var a = 100;console.log(a);// 第二種var b;b = 'xkd';console.log(b);// 第三種var c = true;console.log(c);// 第四種var d;d = [1, 2, 3];console.log(d);

執行程式碼,輸出:

100xkdtrue[ 1, 2, 3 ]

需要注意的是,在給變數命名的時候,記得不要使用 name,否則會和 DOM 中全域性 window 物件下的 name 屬性出現重名。

示例:

我們在 VSCode 中編寫程式碼的時候,如果使用 name 作為變數名,VSCode 會直接提示錯誤,如下圖所示:

還有一點需要注意的是,我們知道了 TypeScript 是強型別語言,所以如果我們在宣告變數的時候,給變數指定了一個型別,而賦值時將另外一個型別的值賦值給這個變數,TypeScript 編譯器會產生錯誤。

示例:

我們宣告一個字串型別的變數 a ,然後給這個變數賦一個數字型別的值:

VSCode 中會用紅色波浪線提示我們這樣做是錯誤的,將滑鼠放到紅色波浪線上,會出現錯誤原因。

型別斷言

TypeScript 中允許將變數從一種型別更改為另一種型別。TypeScript 將此過程稱為型別斷言(Type Assertion)。實現方法就是將目標型別用 <> 符號包圍,並將其放在變數或表示式的前面。

語法:

<型別> 值

示例:

例如下面這段程式碼:

var str1 = '1' var str2:number = 100;console.log(typeof(str1));  console.log(typeof(str2));  var str2:number = <number> <any> str1   // 型別斷言console.log(typeof(str1));  console.log(typeof(str2));  

編譯成 JavaScript 程式碼:

var str1 = '1';var str2 = 100;console.log(typeof (str1)); console.log(typeof (str2)); var str2 = str1; // 型別斷言console.log(typeof (str1)); console.log(typeof (str2)); 

輸出結果:

stringnumberstringstring

型別斷言看起來很像型別轉換,但是其實並不一樣,一般型別轉換意味著某種執行時的支援,而型別斷言只是一個編譯時構造,是一種向編譯器提供有關如何分析程式碼的提示方法。TypeScript 會假設你已經進行了必須的檢查。

除此之外,型別斷言還有另一種語法形式,這兩種形式的寫法是等價的,至於使用哪個大多數情況下是憑個人喜好。

如下所示:

值 as 型別

但是如果我們在 TypeScript 裡使用 JSX,就只支援此種寫法。

變數作用域

一個變數的作用域指定了這個變數的定義位置,程式中變數的可用性是由它作用域決定的。變數不可以在作用域以外的地方使用。

TypeScript 的作用域分為下面三種:

全域性作用域:全域性變數定義在程式結構的外部,可以在程式碼的任何位置使用。區域性作用域:區域性變數,只能在宣告它們的函式或程式碼塊中訪問。類作用域:也可稱為欄位,類變數宣告在一個類裡頭,但在類的方法外面,該變數可以透過類的物件來訪問。類變數也可以是靜態的,靜態的變數可以透過類名直接訪問。

示例:

下面程式碼中定義了三個變數,這三個變數的作用域都不同:

var global_a = 1; // 全域性變數class Person{    class_a = 2;           // 類變數    static static_a = 3;   // 靜態變數    show():void{        var local_a = 4;   // 區域性變數,只能在定義它的函式中使用    }}// 全域性變數可以在全域性使用console.log("全域性變數:" + global_a);// 靜態變數可以直接透過類名訪問console.log("靜態變數:" + Person.static_a);// 例項化類var per = new Person();// 類變數需要透過例項物件訪問console.log("例項變數:" + per.class_a);

使用tsc test.ts 編譯後的 JavaScript 程式碼:

var global_a = 1; // 全域性變數var Person = /** @class */ (function () {    function Person() {        this.class_a = 2; // 類變數    }    Person.prototype.show = function () {        var local_a = 4; // 區域性變數,只能在定義它的函式中使用    };    Person.static_a = 3; // 靜態變數    return Person;}());// 全域性變數可以在全域性使用console.log("全域性變數:" + global_a);// 靜態變數可以直接透過類名訪問console.log("靜態變數:" + Person.static_a);// 例項化類var per = new Person();// 類變數需要透過例項物件訪問console.log("例項變數:" + per.class_a);

執行 JavaScript 程式碼,輸出:

全域性變數:1靜態變數:3例項變數:2

首先 global_a 是一個全域性變數,可以在全域性範圍中使用,例如可以在 Person 類外部使用,在 Person 類裡面使用,還可以在 show 函式中使用。

而 class_a 是類變數,定義在類中的變數叫做類變數,我們可以透過類的例項物件訪問類變數,如 per.class_a。

static_a 也是一個類變數,但是這個變數被 static 關鍵字修飾,所以它也是一個靜態變數,靜態變數可以直接透過類名來訪問,如 Person.static_a 。

最後就是區域性變數 local_a,這個變數的作用域僅在它所處的函式內,所以它只能在 show() 函式中使用,如果在其他地方使用則會報錯。

現在你弄清楚了什麼是區域性變數、全域性變數、類變數嗎。

動手練習

1.使用四種不同的方式宣告一個字串型別的變數,並給變數賦值?

2.請指出下列中變數 a、b、c、d 的作用域範圍?

class Car{    a = "red";    run():string{        var b = "40km/h";        return b;    }    wheel(){        var c = 4;    }}var d = "jeep";

連結:https://www.9xkd.com/

6
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 在分散式系統中使用 DDD