1.概述
JavaScript 的數(shù)據(jù)類型,共有六種。(ES6 又新增了第七種 Symbol 類型的值)
數(shù)值(number):整數(shù)和小數(shù)(比如1和3.14)
字符串(string):文本(比如Hello World)。
布爾值(boolean):表示真?zhèn)蔚膬蓚€特殊值,即true(真)和false(假)
undefined:表示“未定義”或不存在,即由于目前沒有定義,所以此處暫時沒有任何值
null:表示空值,即此處的值為空。
對象(object):各種值組成的集合
symbol(符號)
通常,數(shù)值、字符串、布爾值這三種類型,合稱為原始類型(primitive type)的值,即它們是最基本的數(shù)據(jù)類型,不能再細分了。對象則稱為合成類型(complex type)的值,因為一個對象往往是多個原始類型的值的合成,可以看作是一個存放各種值的容器。至于undefined和null,一般將它們看成兩個特殊值。
對象是最復(fù)雜的數(shù)據(jù)類型,又可以分成三個子類型。
狹義的對象(object)
數(shù)組(array)
函數(shù)(function)
狹義的對象和數(shù)組是兩種不同的數(shù)據(jù)組合方式,除非特別聲明,本教程的”對象“都特指狹義的對象。函數(shù)其實是處理數(shù)據(jù)的方法,JavaScript 把它當成一種數(shù)據(jù)類型,可以賦值給變量,這為編程帶來了很大的靈活性,也為 JavaScript 的“函數(shù)式編程”奠定了基礎(chǔ)。
2.typeof 運算符
JavaScript 有三種方法,可以確定一個值到底是什么類型。
typeof運算符
instanceof運算符
Object.prototype.toString方法
instanceof運算符和Object.prototype.toString方法,將在后文介紹。這里介紹typeof運算符。
typeof運算符可以返回一個值的數(shù)據(jù)類型。
數(shù)值、字符串、布爾值分別返回number、string、boolean。

函數(shù)返回function。

undefined返回undefined。

利用這一點,typeof可以用來檢查一個沒有聲明的變量,而不報錯。

上面代碼中,變量v沒有用var命令聲明,直接使用就會報錯。但是,放在typeof后面,就不報錯了,而是返回undefined。
實際編程中,這個特點通常用在判斷語句。

對象返回object。

null返回object。

null的類型是object,這是由于歷史原因造成的。1995年的 JavaScript 語言第一版,只設(shè)計了五種數(shù)據(jù)類型(對象、整數(shù)、浮點數(shù)、字符串和布爾值),沒考慮null,只把它當作object的一種特殊值。后來null獨立出來,作為一種單獨的數(shù)據(jù)類型,為了兼容以前的代碼,typeof null返回object就沒法改變了。
3.null和undefied
3.1概述
null與undefined都可以表示“沒有”,含義非常相似。將一個變量賦值為undefined或null,老實說,語法效果幾乎沒區(qū)別。

上面代碼中,變量a分別被賦值為undefined和null,這兩種寫法的效果幾乎等價。
在if語句中,它們都會被自動轉(zhuǎn)為false,相等運算符(==)甚至直接報告兩者相等

從上面代碼可見,兩者的行為是何等相似!谷歌公司開發(fā)的 JavaScript 語言的替代品 Dart 語言,就明確規(guī)定只有null,沒有undefined!
既然含義與用法都差不多,為什么要同時設(shè)置兩個這樣的值,這不是無端增加復(fù)雜度,令初學者困擾嗎?這與歷史原因有關(guān)。
1995年 JavaScript 誕生時,最初像 Java 一樣,只設(shè)置了null表示”無”。根據(jù) C 語言的傳統(tǒng),null可以自動轉(zhuǎn)為0。

從上面代碼可見,兩者的行為是何等相似!谷歌公司開發(fā)的 JavaScript 語言的替代品 Dart 語言,就明確規(guī)定只有null,沒有undefined!
既然含義與用法都差不多,為什么要同時設(shè)置兩個這樣的值,這不是無端增加復(fù)雜度,令初學者困擾嗎?這與歷史原因有關(guān)。
1995年 JavaScript 誕生時,最初像 Java 一樣,只設(shè)置了null表示”無”。根據(jù) C 語言的傳統(tǒng),null可以自動轉(zhuǎn)為0。

上面代碼中,null轉(zhuǎn)為數(shù)字時,自動變成0。
但是,JavaScript 的設(shè)計者 Brendan Eich,覺得這樣做還不夠。首先,第一版的 JavaScript 里面,null就像在 Java 里一樣,被當成一個對象,Brendan Eich 覺得表示“無”的值最好不是對象。其次,那時的 JavaScript 不包括錯誤處理機制,Brendan Eich 覺得,如果null自動轉(zhuǎn)為0,很不容易發(fā)現(xiàn)錯誤。
因此,他又設(shè)計了一個undefined。區(qū)別是這樣的:null是一個表示“空”的對象,轉(zhuǎn)為數(shù)值時為0;undefined是一個表示”此處無定義”的原始值,轉(zhuǎn)為數(shù)值時為NaN。

3.2 含義和用法
對于null和undefined,大致可以像下面這樣理解。
null表示空值,即該處的值現(xiàn)在為空。調(diào)用函數(shù)時,某個參數(shù)未設(shè)置任何值,這時就可以傳入null,表示該參數(shù)為空。比如,某個函數(shù)接受引擎拋出的錯誤作為參數(shù),如果運行過程中未出錯,那么這個參數(shù)就會傳入null,表示未發(fā)生錯誤。
undefined表示“未定義”,下面是返回undefined的典型場景。

4.布爾值
布爾值代表“真”和“假”兩個狀態(tài)。“真”用關(guān)鍵字true表示,“假”用關(guān)鍵字false表示。布爾值只有這兩個值。
下列運算符會返回布爾值:
兩元邏輯運算符: && (And),|| (Or)
前置邏輯運算符: ! (Not)
相等運算符:===,!==,==,!=
比較運算符:>,>=,<,<=
如果 JavaScript 預(yù)期某個位置應(yīng)該是布爾值,會將該位置上現(xiàn)有的值自動轉(zhuǎn)為布爾值。轉(zhuǎn)換規(guī)則是除了下面六個值被轉(zhuǎn)為false,其他值都視為#true。
undefined
null
false
0
NaN
""或''(空字符串)
布爾值往往用于程序流程的控制,請看一個例子。

上面代碼中,if命令后面的判斷條件,預(yù)期應(yīng)該是一個布爾值,所以 JavaScript 自動將空字符串,轉(zhuǎn)為布爾值false,導致程序不會進入代碼塊,所以沒有任何輸出。
注意,空數(shù)組([])和空對象({})對應(yīng)的布爾值,都是true。
