JavaScript 核心觀念(13)-運算子、型別與文法-動態型別

前言

當我們在轉寫 JavaScript 的時候,完全不用去宣告該變數是什麼型別,而這主要原因在於 JavaScript 是一個動態型別的語言。

動態型別

何謂動態型別呢?這邊舉例 C 語言的宣告變數,當假使今天要宣告一個 int 數字類型的變數,那麼就要像以下這樣宣告

1
2
int a = 4;
int b = 3;

而字串呢?在 C 語言中字串是使用 char 宣告(C 語言中字串是採用陣列形式呈現)

1
char str[6] = "hello";

而 JavaScript 呢?在上述範例中 JavaScript 在執行階段就會自己辨別賦予正確的型別

1
2
3
var a = 4;
var b = 3;
var str = 'hello';

在這邊我們可以透過 typeof 來確定型別

1
2
3
4
5
6
7
var a = 4;
var b = 3;
var str = 'hello';

console.log(typeof(a)); // number 就是 int、float。
console.log(typeof(b)); // number
console.log(typeof(str)); // string

而這邊 JavaScript 也有所謂的型別轉換,例如原本的 string 變成 number

1
2
3
4
5
var a = 4;
console.log(typeof(a)); // number

a = 'hello';
console.log(typeof(a)); // string

因此 JavaScript 有兩個很危險的陷阱,也就是顯性的轉換(Explicit conversion)以及隱性的轉換(Implicit conversion)。

當我們無法確定型別時,其實在開發時會有很嚴重的問題發生,也就是 bug,我們會無法確認變數的型別,而顯性的轉換簡單來講就是你可以看到的轉換,以上面的範例來講,我們從程式碼可以推斷出它轉換成了 number 接下來又因為重新賦予值轉換成 string,這就是所謂的顯性轉換。

而隱性的轉換呢?簡單來講當你不確定 JavaScript 規則時,就很容易發生這種狀況,例如最常見的問題

1
2
3
var a = 1;

a = a + '1';

通常來講我們可能會認知為 2,但是相信你看這一篇文章應該會疑惑 number 要怎麼跟 string 相加?因此這時候 JavaScript 就會很雞婆的依照一些規則幫你做型別轉換,例如加號運算子的規則是當「number 遇到 string 時,number 會被轉換成 string」,因此 a + '1'; 會變成 11,並且是一個字串。

1
2
3
4
5
var a = 1;

a = a + '1';

console.log(a, typeof(a)); // 11, string

而這就是所謂的隱性轉換。

當我們可以理解這些規則後也就可以避免一些開發上的 bug。

參考文獻