js中堆記憶體和棧記憶體事例
阿新 • • 發佈:2019-02-11
2013/4/2 17:28:34
OS回收,分配方式倒是類似於連結串列。
堆則是存放在二級快取中,生命週期由虛擬機器的垃圾回收演算法來決定(並不是一旦成為孤兒物件就能被回收)。所以呼叫這些物件的速度要相對來得低一些
堆(資料結構):堆可以被看成是一棵樹,如:堆排序
棧(資料結構):一種後進先出的的資料結構
堆和棧的區別可以用如下的比喻來看出:
使用棧就象我們去飯館裡吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。
js中如果建立兩個個物件p1,p2,使用p1為p2賦值會怎樣?
var p1 = new Person();
p1.name = ‘zhangsan’;
p1.age = 30;
var p2 = p1;
這時,p1和p2會指向同一記憶體
<script>
function person(){
}
var p1 = new person();
p1.name= 'zhangshan';
var p2= p1;//物件之間賦值,現在p1 和 p2指向的是同一個記憶體空間
// alert(p2.name);
var p2 = 'apple'; //將p2的值發生改變會影響p1的值
// alert(p1.name);
p2 = null ;//這裡是指將p2的棧記憶體清除了,但是p2指向的堆記憶體還是存在!
// alert(p2.name);
alert(p1.name);//所以這裡可以輸出結果!
</script>
棧(操作系統):由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧 棧使用的是一級快取, 他們通常都是被呼叫時處於儲存空間中,呼叫完畢立即釋放 堆(作業系統): 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由