JavaScript 是動態弱型別語言,TypeScript 呢?

語言: CN / TW / HK

theme: cyanosis

用幾個小時來制定計劃,可以節省幾周的程式設計時間。


首先說明,強弱型別之分不是某一個權威機構定義的,而是在 1974 年由兩位電腦科學家提出:

在強型別語言中,當一個物件從呼叫函式傳遞到被呼叫函式時,其型別必須與被呼叫函式中宣告的型別相容。—— Liskov, Zilles 1974

所以現在強型別和弱型別還有較大爭議,普遍認為強型別有更強的型別約束,而弱型別中幾乎沒有約束。

型別系統

b0aeb7ffd1667b9162e5329154d43777_720w.png

強型別

  • 語言層面限制函式的實參型別必須與形參型別相同
  • 強型別語言中不允許任意的隱式型別轉換

優勢

  • 錯誤更早暴露
  • 程式碼提示更智慧
  • 編碼更準確重構更牢靠
  • 減少不必要的型別判斷

弱型別

  • 弱型別語言層面不會限制實參的型別
  • 弱型別語言允許任意的資料隱式型別轉換

靜態型別

一個變數宣告時它的型別就是明確的,宣告過後它的型別不再允許修改

動態型別

執行階段才能夠明確變數型別,變數的型別隨時可以改變

動態型別語言中的變數沒有型別(TS 的 ang),變數中存放的值是有型別的

總結

```tsx let num1: number = 1; num1 = '1'; // error TS2322: Type 'string' is not assignable to type 'number'.

let str: string = 'str'; let num2: number = 2; str = str + num2; // str2 ```

```jsx let cc = {}; cc = '1';

let aa = '123'; let bb = true; aa = aa * bb; // 123 ```

總的來說,談論語言的“強”與“弱”並沒有顯得很有必要,它們在技術上沒有標準的定義,最好是給出具體的問題進行具體的分析。如:”是否能保證呼叫方法時傳入的實參型別與形參相同?“在 JavaScript 這是否定的,但在Java和TypeScript中是肯定的。

相比之下,靜態型別和動態型別就沒有爭議了。靜態型別是在編譯時檢查型別安全,並在編譯時報錯。而動態型別則是在程式碼執行期間檢查值的型別,如在 JS 中訪問 null、undefined 的屬性;呼叫未宣告的方法。

tsx let aa: string = '123'; let bb: number = 1; console.log(aa * bb); // The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.

(參見 Oracle 文件:第五章:型別轉換

```java int x=20; boolean y=true; System.out.println("printing: " + x + y); // printing: 20true

// Java 編譯器對程式碼進行重寫 int x=20; boolean y=true; System.out.println("printing: " + new Integer(x).toString() + Boolean.toString(y)); ```