ES有5種原始值(primitive value),他們代表著ES能直接訪問的數據。
5種原始值對應著5種原始類型。
* Undefined類型。只有一個值,就是undefined。
* Null類型。只有一個值,就是null。
* Boolean類型。有兩個值,true和false。
* String類型。值被認為是有限長度的字符序列。
* Number類型。值就是數值。
# 關于typeof關鍵字
一般情況下,使用typeof可以判斷一個值的原始類型。
~~~
typeof true;//"boolean"
typeof 'ES';//"string"
typeof 0;//"number"
~~~
筆者建議用===undefined(null)來判斷一個變量是否為Undefined(Null)類型。
理由如下:
* Undefined和Null類型只有一個值,使用===比較直觀。
* 由于某些歷史原因,typeof null將會得到"object"。
當typeof 作用于對象時:
~~~
typeof {};//"object"
~~~
對象不能被直接訪問,所以不算是原始值,但typeof對象返回了"object"。
對象的引用本質上也是值,如果把typeof的作用視為識別值的類型,無論其是否為原始值。
那么typeof對象返回“object”就是合理的行為了。
typeof任何類(class)的對象都會返回"object"。
可是Function類除外。
~~~
typeof new Function();//"function"
~~~
對于這種矛盾的現象,我們可以簡單地歸結于typeof的設計缺陷。
另一方面,我們可以認為typeof并不純粹是用于識別值的類型。
# 關于String類型
為了保障程序的運作效率,String類型的值在ES內部實現中是一個引用值,ES通過這個引用值間接地訪問具體的字符序列。

為什么不直接把String類型設計成引用類型呢?
因為字符串被實現為一段連續的值,中途不需要通過引用去間接訪問后續的字符序列,這樣就可以保障字符串的訪問效率。

如果作為引用類型設計,那么當ES訪問字符串中的每個字符時都需要判斷他是值類型還是引用類型,極其地浪費運算資源。
在程序內部將字符串視為一段連續的值時,就可以默認他的每一項都是值,不進行間接訪問的判斷了。
綜上所述,String類型仍然屬于值類型。