前言
JavaScript 是動態型別語言,會在執行中不斷轉換
動態型別
- 靜態型別:編譯時就知道變數型別
- 動態型別:執行時才知道變數型別
JavaScript的變數在執行階段,被賦予值的時候,才會有型別(創造階段只會在記憶體裡分配一個空間給這個變數)。
也就是說,JavaScript 在執行階段就會自己辨別賦予正確的型別,變數的型別來自於值。
var a = 4;
var str = 'hello';
這邊我們可以透過 typeof 來確定型別
var a = 4;
var str = 'hello';
console.log(typeof(a)); // number
console.log(typeof(str)); // string
這邊 JavaScript 也有所謂的型別轉換,例如原本的 string 變成 number
var a = 4;
console.log(typeof(a)); // number
a = 'hello';
console.log(typeof(a)); // string
因此 JavaScript 有兩個很危險的陷阱,也就是顯性的轉換(Explicit conversion)以及隱性的轉換(Implicit conversion)
顯性的轉換(Explicit conversion)
當我們無法確定型別時,其實在開發時會有很嚴重的問題發生,也就是 bug,我們會無法確認變數的型別,而顯性的轉換簡單來講就是你可以看到的轉換,以上面的範例來講,我們從程式碼可以推斷出它轉換成了 number 接下來又因為重新賦予值轉換成 string,這就是所謂的顯性轉換。
隱性的轉換(Implicit conversion)
而隱性的轉換呢?簡單來講當你不確定 JavaScript 規則時,就很容易發生這種狀況,例如最常見的問題
var a = 1;
a = a + '1';
通常來講我們可能會認知為 2,但是相信你看這一篇文章應該會疑惑 number 要怎麼跟 string 相加?因此這時候 JavaScript 就會很雞婆的依照一些規則幫你做型別轉換,例如加號運算子的規則是當「number 遇到 string 時,number 會被轉換成 string」,因此 a + '1'; 會變成 11,並且是一個字串
var a = 1;
a = a + '1';
console.log(a, typeof(a)); // 11, string
這就是所謂的隱性轉換。
理解這些規則後也就可以避免一些開發上的 bug