淺拷貝與深拷貝
阿新 • • 發佈:2020-12-01
如何區分 簡單來說 B複製了A 如果修改A,B也跟著變化, 這就是淺拷貝(拿人手短)。如果修改了A ,B沒有變化 這是深拷貝(自食其力)
1、基本資料型別 number string boolean null undefined symbol
基本資料型別 名值儲存在棧記憶體中,當b=a 直接在棧記憶體中開闢記憶體
2、引用型別 名儲存在棧記憶體,值儲存在堆記憶體中,棧記憶體開闢個地址指向堆記憶體的值。
當b=a b和a的棧記憶體地址同時指向 堆記憶體的同一個值
如深拷貝b=a b和a指向堆記憶體中不同的值 修改任何一個對另一個沒有影響。
簡單是實現一個深拷貝
function deepClone(obj){ let objClone= Array.isArray(obj)?[]:{}; if(obj && typeof obj==="object"){ for(key in obj){ if(obj.hasOwnProperty(key)){ //判斷ojb子元素是否為物件,如果是,遞迴複製 if(obj[key]&&typeof obj[key] ==="object"){ objClone[key] = deepClone(obj[key]); }else{ //如果不是,簡單複製 objClone[key] = obj[key]; } } } } return objClone; } let a=[1,2,3,4], b=deepClone(a); a[0]=2; console.log(a,b);
期中需要注意concat方法與slice 對於物件只有一級層級的 是深拷貝 但 如果物件多於一級層級 是淺拷貝
出了遞迴還可以藉助 JSON.stringfy 和 JSON.parse 來實現深拷貝
function deepClone(obj){ let _obj = JSON.stringify(obj), objClone = JSON.parse(_obj); return objClone } let a=[0,1,[2,3],4], b=deepClone(a); a[0]=1; a[2][0]=1; console.log(a,b);
原理 先將物件轉換成字串 然後再轉換回來