---
# System prepended metadata

title: 變數與資料型別
tags: [' JavaScript']

---

變數與資料型別
===

變數宣告的規則
---
- 可以宣告為以下：
    - 英文字母
    - 底線 `_`
    - 錢字號 `$`
    - 數字（第一個字母不能是數字，放在第一個字母之後可以）
- 區分大小寫，例如：變數 app 和 App 在 JavaScript 被認為是兩個不同的變數。
- 自 JavaScript 1.3 之後支援 Unicode，變數名稱可以使用中文命名。
    - 基於開發習慣，避免使用非英文字母、底線、$ 以外的字元來命名變數；用中文編碼的話，其他語言的系統開啟可能會變亂碼。
- 不可以是保留字 (Reserved Words) 與關鍵字 (keyword)。
    - 保留字：目前沒有特殊用途，但未來可能被拿來當關鍵字使用，所以不能作為變數名稱。
    - 關鍵字： ECMAScript 規定具有特定用途的英文單字，不能作為變數名稱使用。
    - 通常在編輯器中，會以深藍色表示。

變數宣告
---

- ES6 以前，宣告變數使用 var。
- ES6 之後，宣告「變數」使用 let、宣告「常數」使用 const。

### 變數沒有型別，值才有。
JavaScript 是「弱型別」語言，變數本身無需宣告型別，型別的資訊只在值或物件本身，變數用作取得值或物件的參考。

換言之，變數宣告後資料型態未定，真正的資料型態將視指派給變數的內容值而定。
```jsx
// 宣告變數 n，沒有給值，此時 n 的內容為 undefined。
var n;

// 宣告變數 m 的同時給值，此時 m 的內容為數字的 1。
var m = 1;
```

沒有宣告變數的情況下使用，出現 ReferenceError 的錯誤：

![](https://i.imgur.com/lpLF6Fl.png)

### 強型別 vs 弱型別
在程式語言中，依照語言的型別系統 (Type system) 分成「強型別語言」與「弱型別語言」。

強型別是指「程式所定義的變數型別，等於變數在執行時期的型別」。變數在被宣告的時候，必須指定資料型別給它，如果對變數做了錯誤型別的運算，就會出現錯誤。

弱型別正好相反，雖然取得語法簡潔的優點，但要注意型態轉換時產生非預期的問題。

### 全域變數
即便變數在事前沒有透過 var 宣告，仍可以給定變數初始值。
```jsx
m = 1; // 對未宣告的變數 m 賦值
console.log(m);  // 能夠讀取到 m 值，打印 1
```
強烈不建議這麼做，因為會變成全域變數，作用域過大導致全域汙染變數。

變數的資料型別
---
ES5.1 時 JavaScript 內建的型別，主要分成基本型別 (Primitives) 與物件型別 (Object) 。

基本型別又分成 string、number、boolean、null、undefined、Symbol（ES6 新增），其餘歸類至物件型別 (Object)。

- 基本資料型態
    - 數值 ([number](https://hackmd.io/FwIFl5ACRVywK6IVx6JYhQ?view)) 型態：浮點數 (ex. `-4.81`, `123.45`)
    - 字串 ([string](https://hackmd.io/IwbQ8U8kQkq1lZCQJRsLkg?view)) 型態：ex. `"JaveScript"`
    - 布林 ([boolean](https://hackmd.io/Q-bczOJlTS6rEm5Q7jY8XQ?view)) 資料型態：ex. `true`, `false`
- 特殊資料型態
    - [null](https://hackmd.io/mDulQZcUSEqlJMEebDd2Vg?view) 型態：沒有值，將 null 指派給變數可以清空變數
    - 未定義值 ([undefined](https://hackmd.io/mDulQZcUSEqlJMEebDd2Vg?view)) 型態：宣告時未指定初值或不存在的變數
    - [Symbol](https://hackmd.io/yofCf-UWR-iiF_6Vg0Sn2w?view)
- 多值資料型態
    - [物件](https://hackmd.io/tXyM_Av0SyW4OkDH1jYO0A?view)
    - [陣列](https://hackmd.io/8pRUj7G9TMaol3M2O3vZaQ?view)

### 透過 typeof 運算子，判斷型別
判斷型別的方式，可以透過 typeof 運算子，但有時需要處理例外。
- 數值型態 `number`
- 字串型態 `string`
- 布林型態 `boolean`
- 未定義型態 `undefined`
- 對 JavaScript 內建型態(Date)或函式(parseInt) `function`
- 對 reference 型態 `object`

```jsx
typeof 123;          // 'number'
typeof 'Kuro';       // 'string'
typeof true;         // 'boolean'

typeof Date;         // 'function' 
typeof parseInt;     // 'function' 

typeof {};           // 'object'
typeof [];           // 'object'
typeof(new Date());  // 'object'

// 下面兩個要特別注意
typeof window.alert;  // 內建函式，所以是 'function' 
typeof null;          // 'object'
```