javascript中棧內存和堆內存的區別

首先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值改變了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章