首先JavaScript中的變量分爲基本類型和引用類型。基本類型就是保存在棧內存中的簡單數據段,而引用類型指的是那些保存在堆內存中的對象。
1、基本類型
基本類型有Undefined、Null、Boolean、Number 和String。這些類型在內存中分別佔有固定大小的空間,他們的值保存在棧空間,我們通過按值來訪問的。
2、引用類型
引用類型,值大小不固定,棧內存中存放地址指向堆內存中的對象。是按引用訪問的。如下圖所示:棧內存中存放的只是該對象的訪問地址,在堆內存中爲這個值分配空間。由於這種值的大小不固定,因此不能把它們保存到棧內存中。但內存地址大小的固定的,因此可以將內存地址保存在棧內存中。 這樣,當查詢引用類型的變量時, 先從棧中讀取內存地址, 然後再通過地址找到堆中的值。對於這種,我們把它叫做按引用訪問
當我們看到一個變量類型是已知的,就分配在棧裏面,比如INT,Double等。其他未知的類型,比如自定義的類型,因爲系統不知道需要多大,所以程序自己申請,這樣就分配在堆裏面。基本類型大小固定,引用類型大小不固定,分開存放使得程序運行佔用內存最小。
3、棧內存:存放基本類型。 堆內存:存放引用類型(在棧內存中存一個基本類型值保存對象在堆內存中的地址,用於引用這個對象。)
4、基本類型在當前執行環境結束時銷燬,而引用類型不會隨執行環境結束而銷燬,只有當所有引用它
的變量不存在時這個對象才被垃圾回收機制回收。
**********************************************************************
看一個例子:
var x = {name:"aaa"};//初始化一個對象
var obj1 = x;
var obj2 = x; //obj1,obj2指向同一個引用類型
obj1.name = "bbb"; //在原引用上修改對象屬性,x,obj,obj2的name屬性值均改變
obj1 = {name:"bbb"} //給obj1賦了一個新的引用,所以只有obj的name值改變了