六角學院 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 核心篇 - 邁向達人之路