重新梳理下js中的深拷貝和淺拷貝

2021-09-12 16:56:44 字數 1286 閱讀 6149

淺拷貝:

1.最簡單的淺拷貝就賦值。

由於js中的物件都是複雜資料型別,這種資料在記憶體中儲存的時候,存放在堆中。當簡單賦值的時候,其實是將該物件的指標指向同乙個堆位址。

簡單的資料型別存放在棧中,當對簡單的資料型別進行賦值的時候,其實就是直接在棧中新開闢乙個地方專門來儲存一樣的值。

let obj =  };
此時,使用object.assign()和...object方式實現的都是淺拷貝。

此時,第一層資料雖然指向了另乙個新的堆位址,但是它內部的子物件的指標卻還是同乙個位址。這種情況也屬於淺拷貝,只不過是比那種直接賦值(直接複製堆位址)的方式要深刻一些。

2.陣列和物件的淺拷貝

陣列的淺拷貝,有三種方式:

(1) arr1 = arr2;

(2) arr2 = arr1.slice(0);

(3) arr2 = arr1.concat();

物件的淺拷貝,也有3種方式:

(1) obj2 = obj1;

(2) obj2 = object.assign(obj1 ,{} )

(3) obj2 =

深拷貝

物件的深拷貝實際上就是,將前乙個物件複製乙份給後面的那個物件,不管前面的那個物件中的資料結構巢狀有多深,當改變其中乙個物件中的任意深度的某個值後,另乙個物件中的該值不會受任何影響。

1.當物件中的所有屬性值都是簡單資料型別的時候:

function easycopy(p) ;

for (var i in p)

c.uber = p;

return c;

}

2.當要複製的物件中存在某個屬性的value值是物件或者陣列時:

如果像上面的簡單型別那樣直接賦值,那麼子物件對應的屬性實際上指向的是和被拷貝物件中子物件一樣的記憶體位址。因此,只要改了乙個,另乙個也會跟著改變。

function deepcopy(p, c) ;

for (let i in p)

if (typeof p[i] === 'object') ;

deepcopy(p[i], c[i]);

} else

}return c;

}parent =

var child = deepcopy(parent);

總結:

淺拷貝:你變我也變,巢狀物件變,就會跟著變。

深拷貝:管你怎麼變,互不影響。

重新梳理下js中的深拷貝和淺拷貝

淺拷貝 1.最簡單的淺拷貝就賦值。由於js中的物件都是複雜資料型別,這種資料在記憶體中儲存的時候,存放在堆中。當簡單賦值的時候,其實是將該物件的指標指向同乙個堆位址。簡單的資料型別存放在棧中,當對簡單的資料型別進行賦值的時候,其實就是直接在棧中新開闢乙個地方專門來儲存一樣的值。let obj 此時,...

重新梳理下js中的深拷貝和淺拷貝

淺拷貝 1.最簡單的淺拷貝就賦值。由於js中的物件都是複雜資料型別,這種資料在記憶體中儲存的時候,存放在堆中。當簡單賦值的時候,其實是將該物件的指標指向同乙個堆位址。簡單的資料型別存放在棧中,當對簡單的資料型別進行賦值的時候,其實就是直接在棧中新開闢乙個地方專門來儲存一樣的值。let obj 此時,...

js 淺拷貝 深拷貝實現梳理

淺拷貝 1.object.create object.getprototypeof prev object.getownpropertydescriptors prev 最完美 2.object.assign prev 無法拷貝enumerable false的屬性 無法拷貝原型鏈 3.使用for ...