Js堆棧理解

栈(stack) 自动分配的内存空间,它由系统自动释放

堆(heap) 动态分配的内存,大小不定也不会自动释放。

眾所周知,js的變量分基礎類型引用類型;

基礎類型: (String, Number, Boolean, Null, UndefinedSymbol)基礎類型在內存中具有: 佔據空間小,大小固定的特點,且值保存在棧(stack)空間,按值訪問.

引用類型: (對象, 數組, 函數)引用類型在內存中具有: 佔據空间大、大小不固定的特點, 棧內存中存放的地址指向堆(heap)内存中的对象。是按引用訪問的.

接下來我們看兩個例子:


堆棧理解

從上面的例子我們可以看到,基礎類型變量發生複製的行為時,系統會為新的變量分配一個值,跟複製的變量值是互相獨立的且沒有絲毫的影響的,

但引用類型的複製就不一樣了,可以看到當d引用了c的對象值後c發生改變,d也隨之發生改變.

堆棧內存&垃圾回收機制

如我上述所言,基礎類型是存放在棧裡面,按值訪問,引用類型是存放在棧裡面的地址引用了堆內存的對象,是引用訪問.又因為要實現垃圾回收機制,所以每一個基礎類型的值在當前的執行調用棧環境裡面執行完後,就會被自然銷毀.而引用類型的對象,存放在堆內存中並不一定會隨之執行棧的結束而自動銷毀.當對象被其它變量引用時,系統就不會回收它,只有當一個對象沒有任何變量引用它時,系統才會回收.所以我們常見一些對象或者方法在執行完後會有 A = null 的類似賦值.

你可能感兴趣的:(Js堆棧理解)