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

js中的棧記憶體和堆記憶體

1.簡介棧和堆

:棧會自動分配記憶體空間,實體記憶體是連續的,存放基本型別,簡單的資料段,        佔據固定大小的空間。
           基本型別:String,Number,Boolean,Null,Undefined

堆:動態分配的記憶體,實體地址不連續,大小不定也不會自動釋放存放引用型別, 指那些可能由多個值構成的物件,儲存在堆記憶體中,包含引用型別的變數,實際上儲存的不是變數本身,而是指向該物件的指標。
            引用型別

:Function,Array,Object

2.區別

:所有在方法中定義的變數都是放在棧記憶體中,隨著方法的執行結束,這個方法的記憶體棧也自然銷燬。

優點:存取速度比堆快,僅次於直接位於CPU中的暫存器,資料可以共享;
缺點:存在棧中的資料大小與生存期必須是確定的,缺乏靈活性。

:堆記憶體中的物件不會隨方法的結束而銷燬,即使方法結束後,這個物件還可能被另一個引用變數所引用(引數傳遞)。

3.傳值和傳址的區別

這兩者區別就是基本型別和引用型別的區別,

例如:

因為a是陣列,是引用型別,賦給b的時候傳的是棧中的地址,不是堆記憶體中的物件,c僅僅是從a堆記憶體中獲取的一個數據值,並儲存在棧中,所以b修改的時候,會根據地址回到a堆中修改,c則直接在棧中修改,並且不能指向a堆記憶體中。

四.深拷貝和淺拷貝

淺拷貝:也就是隻複製了第一層屬性,複製物件是基本型別
 在複製基本型別時,直接使用等號完成,在複製引用型別時,迴圈遍歷對               象,對每個屬性或值使用等號完成。

例如:

在這個例子中,color2複製color1,因為陣列中的每一項都是基本型別(string)

假如陣列中的某一項儲存的是一個物件,或者是一個數組,又或者說物件的某一個屬性而且是一個物件,此時淺拷貝就不再起作用,那就需要深拷貝啦!
先看一個例子:

在上面這個例子中,score既是屬性又是一個物件。

深拷貝:對屬性中所有引用型別的值,遍歷到是基本型別的值為止,利用遞迴來實現深拷貝。
例如:

對於深拷貝,我們先判斷它是否為引用型別,如果不是,直接返回
如果是,迴圈遍歷該物件的屬性,如果這個屬性還是引用型別,則針對該屬性再次呼叫deepClone函式。