1. 程式人生 > >js中堆記憶體和棧記憶體事例

js中堆記憶體和棧記憶體事例

2013/4/2 17:28:34

js中如果建立兩個個物件p1,p2,使用p1p2賦值會怎樣?

var p1 = new Person();

p1.name = zhangsan;

p1.age = 30;

var p2 = p1;

這時,p1p2會指向同一記憶體

<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>

棧(操作系統):由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧 棧使用的是一級快取, 他們通常都是被呼叫時處於儲存空間中,呼叫完畢立即釋放 堆(作業系統): 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由
OS
回收,分配方式倒是類似於連結串列。 堆則是存放在二級快取中,生命週期由虛擬機器的垃圾回收演算法來決定(並不是一旦成為孤兒物件就能被回收)。所以呼叫這些物件的速度要相對來得低一些 堆(資料結構):堆可以被看成是一棵樹,如:堆排序 棧(資料結構):一種後進先出的的資料結構 堆和棧的區別可以用如下的比喻來看出: 使用棧就象我們去飯館裡吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。 使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。