# 數據類型概述
## 簡介
JavaScript 語言的每一個值,都屬于某一種數據類型。JavaScript 的數據類型,共有六種。(ES6 又新增了第七種 Symbol 類型的值,本教程不涉及。)
- 數值(number):整數和小數(比如`1`和`3.14`)。
- 字符串(string):文本(比如`Hello World`)。
- 布爾值(boolean):表示真偽的兩個特殊值,即`true`(真)和`false`(假)。
- `undefined`:表示“未定義”或不存在,即由于目前沒有定義,所以此處暫時沒有任何值。
- `null`:表示空值,即此處的值為空。
- 對象(object):各種值組成的集合。
通常,數值、字符串、布爾值這三種類型,合稱為原始類型(primitive type)的值,即它們是最基本的數據類型,不能再細分了。對象則稱為合成類型(complex type)的值,因為一個對象往往是多個原始類型的值的合成,可以看作是一個存放各種值的容器。至于`undefined`和`null`,一般將它們看成兩個特殊值。
對象是最復雜的數據類型,又可以分成三個子類型。
- 狹義的對象(object)
- 數組(array)
- 函數(function)
狹義的對象和數組是兩種不同的數據組合方式,除非特別聲明,本教程的“對象”都特指狹義的對象。函數其實是處理數據的方法,JavaScript 把它當成一種數據類型,可以賦值給變量,這為編程帶來了很大的靈活性,也為 JavaScript 的“函數式編程”奠定了基礎。
## typeof 運算符
JavaScript 有三種方法,可以確定一個值到底是什么類型。
- `typeof`運算符
- `instanceof`運算符
- `Object.prototype.toString`方法
`instanceof`運算符和`Object.prototype.toString`方法,將在后文介紹。這里介紹`typeof`運算符。
`typeof`運算符可以返回一個值的數據類型。
數值、字符串、布爾值分別返回`number`、`string`、`boolean`。
```javascript
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
```
函數返回`function`。
```javascript
function f() {}
typeof f
// "function"
```
`undefined`返回`undefined`。
```javascript
typeof undefined
// "undefined"
```
利用這一點,`typeof`可以用來檢查一個沒有聲明的變量,而不報錯。
```javascript
v
// ReferenceError: v is not defined
typeof v
// "undefined"
```
上面代碼中,變量`v`沒有用`var`命令聲明,直接使用就會報錯。但是,放在`typeof`后面,就不報錯了,而是返回`undefined`。
實際編程中,這個特點通常用在判斷語句。
```javascript
// 錯誤的寫法
if (v) {
// ...
}
// ReferenceError: v is not defined
// 正確的寫法
if (typeof v === "undefined") {
// ...
}
```
對象返回`object`。
```javascript
typeof window // "object"
typeof {} // "object"
typeof [] // "object"
```
上面代碼中,空數組(`[]`)的類型也是`object`,這表示在 JavaScript 內部,數組本質上只是一種特殊的對象。這里順便提一下,`instanceof`運算符可以區分數組和對象。`instanceof`運算符的詳細解釋,請見《面向對象編程》一章。
```javascript
var o = {};
var a = [];
o instanceof Array // false
a instanceof Array // true
```
`null`返回`object`。
```javascript
typeof null // "object"
```
`null`的類型是`object`,這是由于歷史原因造成的。1995年的 JavaScript 語言第一版,只設計了五種數據類型(對象、整數、浮點數、字符串和布爾值),沒考慮`null`,只把它當作`object`的一種特殊值。后來`null`獨立出來,作為一種單獨的數據類型,為了兼容以前的代碼,`typeof null`返回`object`就沒法改變了。
## 參考鏈接
- Axel Rauschmayer, [Improving the JavaScript typeof operator](http://www.2ality.com/2011/11/improving-typeof.html)
- 前言
- 入門篇
- 導論
- 歷史
- 基本語法
- 數據類型
- 概述
- null,undefined 和布爾值
- 數值
- 字符串
- 對象
- 函數
- 數組
- 運算符
- 算術運算符
- 比較運算符
- 布爾運算符
- 二進制位運算符
- 其他運算符,運算順序
- 語法專題
- 數據類型的轉換
- 錯誤處理機制
- 編程風格
- console 對象與控制臺
- 標準庫
- Object 對象
- 屬性描述對象
- Array 對象
- 包裝對象
- Boolean 對象
- Number 對象
- String 對象
- Math 對象
- Date 對象
- RegExp 對象
- JSON 對象
- 面向對象編程
- 實例對象與 new 命令
- this 關鍵字
- 對象的繼承
- Object 對象的相關方法
- 嚴格模式
- 異步操作
- 概述
- 定時器
- Promise 對象
- DOM
- 概述
- Node 接口
- NodeList 接口,HTMLCollection 接口
- ParentNode 接口,ChildNode 接口
- Document 節點
- Element 節點
- 屬性的操作
- Text 節點和 DocumentFragment 節點
- CSS 操作
- Mutation Observer API
- 事件
- EventTarget 接口
- 事件模型
- Event 對象
- 鼠標事件
- 鍵盤事件
- 進度事件
- 表單事件
- 觸摸事件
- 拖拉事件
- 其他常見事件
- GlobalEventHandlers 接口
- 瀏覽器模型
- 瀏覽器模型概述
- window 對象
- Navigator 對象,Screen 對象
- Cookie
- XMLHttpRequest 對象
- 同源限制
- CORS 通信
- Storage 接口
- History 對象
- Location 對象,URL 對象,URLSearchParams 對象
- ArrayBuffer 對象,Blob 對象
- File 對象,FileList 對象,FileReader 對象
- 表單,FormData 對象
- IndexedDB API
- Web Worker
- 附錄:網頁元素接口
- a
- img
- form
- input
- button
- option
- video,audio