值類型:也稱爲原始數據或原始值(primitive value)。javascript
這類值存儲在棧(stack)中,棧是內存中一種特殊的數據結構,也稱爲線性表,棧按照後進先出的原則存儲數據,先進入的數據被壓入棧底,最後插入(push)的數據放在棧頂,須要讀取數據時從棧頂開始彈出(pop)數據,即最後一個數據被第一個讀出來。所以說,值類型都是簡單的數據段。變量的位置和變量值的位置是重疊的,也就是說值類型的數據被存儲在變量被訪問的位置。html
引用類型:這類值存儲在堆(heap)中,堆是內存中的動態區域,至關於自留空間,在程序運行期間會動態分配給代碼和堆棧。java
堆中存儲的通常都是對象,而後經過一個編號傳遞給棧內變量,這個編號就是所謂的引用指針(point),這樣變量和變量值之間是分離的,它們經過指針相聯繫。當讀寫數據時,計算機經過變量的指針找到堆中的數據塊,並進行操做。數據結構
在JavaScript中,number、string、boolean、null和undefined型數據都是值類型。因爲值類型數據佔據的空間都是固定的,因此能夠把它們存儲在狹窄的內存棧區。這種存儲方式更方便計算機進行查找和操做,因此執行速度會很是快。post
而對於object型數據(包括function和array)來講,因爲它們的大小是不固定的,因此不能存儲在棧區,只能被分配到堆區,若是存儲在棧區,則會下降計算機尋址的速度。而堆的空間是不固定的,因此很適合存儲大小不固定的對象數據,而後在棧區存儲對象在堆區的地址便可,而地址的大小是固定的,因此這種分離存儲的方法不會影響計算機的尋址速度,對於變量的性能也沒有任何負面影響(如圖)。性能
在JavaScript語言中,object、function和array等對象都是引用型數據。不少語言都把字符串視爲引用型數據,而不是值類型,由於字符串的長度是可變的。可是JavaScript比較特殊,它把字符串做爲值類型進行處理。不過,字符串在複製和傳遞運算中,是以引用型數據的方法來處理的。url
1.返回數據類型指針
undefinedhtm
string對象
boolean
number
symbol(ES6)
Object
Function