0%

JS核心(12)-運算子、型別與文法-動態型別

前言

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