1. 程式人生 > 實用技巧 >淺拷貝與深拷貝

淺拷貝與深拷貝

如何區分 簡單來說 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);

原理 先將物件轉換成字串 然後再轉換回來