js中深拷貝與淺拷貝(堆記憶體、棧記憶體的關係)
淺拷貝只會在引用型別中出現
基本資料型別有哪些,number,string,boolean,null,undefined,symbol以及未來ES10新增的BigInt(任意精度整數)七類。
引用資料型別(Object類)有常規名值對的無序物件{a:1},陣列[1,2,3],以及函式等。
首先看一下定義
深拷貝:簡單來說假設B複製了A,當修改A時,B不發生變化
淺拷貝:簡單來說假設B複製了A,當修改A時,B也發生變化
實際情況能碰到
let temp1 = { a: 1 } temp1 = temp2 temp2.a = 2 console.log(temp1.a)// 這裡輸出2
也就是temp1 複製了 temp2,temp2的值改變了,temp1也隨之改變
以上是一個標準的淺拷貝
瞭解一下js中的堆記憶體與棧記憶體
在js引擎中對變數的儲存主要有兩種位置,堆記憶體和棧記憶體。
和java中對記憶體的處理類似,棧記憶體主要用於儲存各種基本型別的變數,包括Boolean、Number、String、Undefined、Null,symbol以及物件變數的指標,這時候棧記憶體給人的感覺就像一個線性排列的空間,每個小單元大小基本相等。
而堆記憶體主要負責像物件Object這種變數型別的儲存,如下圖
引用型別中複製(淺拷貝)的只是棧記憶體中的指標,指向同一個堆記憶體的物件
如何實現深拷貝
最簡單的方法就是JSON.stringify與JSON.parse方法
function deepClone(obj){ let _obj = JSON.stringify(obj), objClone = JSON.parse(_obj); return objClone }