六角學院 JS 核心筆記 (十二)【運算子、型別與文法】- 動態型別和弱型別

JavaScript 是動態型別、弱型別的語言。

所謂的動態語言,就是在執行的時候,變數才會依照賦予值的型別,來決定變數的型別。因此變數的型別是可以不斷改變的。

而弱型別則是,偏向容忍隱性的型別轉換,但是怎麼轉換是它自己決定

詳情可以參考之前寫過的這篇:靜態語言 / 動態語言、強型別 / 弱型別、静態作用域 / 動態作用域。以下僅重點提到一些需要注意的觀念。

動態型別

JavaScript 的運行可以分為兩個階段:創造 / 編譯階段、執行階段

舉個例子來說明:

1
2
3
4
var num = 10;
console.log(typeof num);
num = "Hello";
console.log(typeof num);

上面的程式碼依照提升 (Hoisting) 概念可以看成是:

1
2
3
4
5
6
7
8
// 創造 / 編譯階段
var num;

// 執行階段
num = 10;
console.log(typeof num); // 輸出結果:number
num = "Hello";
console.log(typeof num); // 輸出結果:string

創造階段的時候,先在記憶體中準備一個空間給 num 變數。

直到第五行,因為 10 本身是一個數字型別 number (可以自己用 console.log(typeof 10); 檢查看看,結果會出現 number),因此當 10 被賦予到變數 num 時,num 就會是數字型別。

到了第七行,因為 "Hello" 本身是一個字串型別 string (console.log(typeof "Hello");,結果會出現 string),因此當 "Hello" 被賦予到變數 num 時,num 就會是字串型別。

變數依照賦予值的型別,來決定變數的型別。

弱型別

弱型別容忍隱性的型別轉換,但是怎麼轉換是它自己決定。如下的例子:

1
2
3
4
5
var a = 1;
a = a + "1";
console.log(a, typeof a); // 11 string
a = a * 3;
console.log(a, typeof a); // 33 "number"

JavaScript 在第二行時,將數字型別的 a 隱性轉換為字串型別,並且和 "1" 合併,第三行時 a 顯示為字串 11,但是第四行遇到運算子 *a 又被隱性轉換回數字型別,並且乘上 3,因此第五行 a 顯示為數字 33

弱型別還允許不同型別之間的比對,因為它們可以被隱性型別轉換。== 比對兩者的=== 比對兩者的型別和值

參考資料:
六角學院:JavaScript 核心篇 - 邁向達人之路