六角學院 JS 核心筆記 (十二)【運算子、型別與文法】- 動態型別和弱型別
JavaScript 是動態型別、弱型別的語言。
所謂的動態語言,就是在執行的時候,變數才會依照賦予值的型別,來決定變數的型別。因此變數的型別是可以不斷改變的。
而弱型別則是,偏向容忍隱性的型別轉換,但是怎麼轉換是它自己決定。
詳情可以參考之前寫過的這篇:靜態語言 / 動態語言、強型別 / 弱型別、静態作用域 / 動態作用域。以下僅重點提到一些需要注意的觀念。
動態型別
JavaScript 的運行可以分為兩個階段:創造 / 編譯階段、執行階段。
舉個例子來說明:
1 | var num = 10; |
上面的程式碼依照提升 (Hoisting) 概念可以看成是:
1 | // 創造 / 編譯階段 |
創造階段的時候,先在記憶體中準備一個空間給 num
變數。
直到第五行,因為 10
本身是一個數字型別 number
(可以自己用 console.log(typeof 10);
檢查看看,結果會出現 number
),因此當 10
被賦予到變數 num
時,num
就會是數字型別。
到了第七行,因為 "Hello"
本身是一個字串型別 string
(console.log(typeof "Hello");
,結果會出現 string
),因此當 "Hello"
被賦予到變數 num
時,num
就會是字串型別。
變數依照賦予值的型別,來決定變數的型別。
弱型別
弱型別容忍隱性的型別轉換,但是怎麼轉換是它自己決定。如下的例子:
1 | var a = 1; |
JavaScript 在第二行時,將數字型別的 a
隱性轉換為字串型別,並且和 "1"
合併,第三行時 a
顯示為字串 11
,但是第四行遇到運算子 *
,a
又被隱性轉換回數字型別,並且乘上 3
,因此第五行 a
顯示為數字 33
。
弱型別還允許不同型別之間的比對,因為它們可以被隱性型別轉換。==
比對兩者的值、===
比對兩者的型別和值。
參考資料:
六角學院:JavaScript 核心篇 - 邁向達人之路