深淺拷貝以及深淺拷貝的方法

2021-10-14 12:02:03 字數 1368 閱讀 7872

先考慮一種情況,對乙個已知物件進行拷貝,編譯系統會自動呼叫一種建構函式——拷貝建構函式,如果使用者未定義拷貝建構函式,則會呼叫預設拷貝建構函式

執行結果:呼叫一次建構函式,呼叫兩次析構函式,兩個物件的指標成員所指記憶體相同,name指標被分配一次記憶體,但是程式結束時該記憶體卻被釋放了兩次,會造成記憶體洩漏問題!

這是由於編譯系統在我們沒有自己定義拷貝建構函式時,會在拷貝物件時呼叫預設拷貝建構函式,進行的是淺拷貝!即對指標name拷貝後會出現兩個指標指向同乙個記憶體空間。

所以,在對含有指標成員的物件進行拷貝時,必須要自己定義拷貝建構函式,使拷貝後的物件指標成員有自己的記憶體空間,即進行深拷貝,這樣就避免了記憶體洩漏發生。

執行結果:呼叫一次建構函式,一次自定義拷貝建構函式,兩次析構函式。兩個物件的指標成員所指記憶體不同。

1. 使用json.parse()與json.stringify()對物件進行拷貝

通常情況下,我們可以使用json.parse()與 json.stringify()實現物件的深轉殖,如下:

var clone = function (obj)         //這種方法只適用於純資料json物件的深度轉殖,因為有些時候,這種方法也有缺陷

2.目前沒有發現bug的物件深拷貝方法

var clone = function (obj) {

if(obj === null) return null

if(typeof obj !== 'object') return obj;

if(obj.constructor===date) return new date(obj);

if(obj.constructor === regexp) return new regexp(obj);

var newobj = new obj.constructor ();  //保持繼承鏈

for (var key in obj) {

if (obj.hasownproperty(key)) {  //不遍歷其原型鏈上的屬性

var val = obj[key];

newobj[key] = typeof val === 'object' ? arguments.callee(val) : val; // 使用arguments.callee解除與函式名的耦合

return newobj; 

3.展開運算子進行深拷貝

var arr1=[1,2,5,6,4];

var arr2=[...arr1];

arr1 == arr2      // false;

**網路。

深淺拷貝方法

let a let b a a.age 2 console.log b.age 2首先可以通過object.assign來解決這個問題,很多人認為這個函式是用來深拷貝的。其實並不是,object.assign只會拷貝所有的屬性值到新的物件中,如果屬性值是物件的話,拷貝的是位址,所以並不是深拷貝。le...

拷貝和深淺拷貝

當list2為list的拷貝物件時,list內的可變資料型別變化,list2變化 list內的不可變資料型別變化,list2變化。總之 list變化list2一定變化 list 1,2,3,4,list2 list print list print list2 1,2,3,4,5 1,2,3,4,5...

python set集合 以及 深淺拷貝

set集合 特點 無序,不重複,元素必須可雜湊 不可變 作用 去重複 本身是可變的資料型別.有增刪改查操作.frozenset 凍結的集合.不可變的.可hash的 深淺拷貝 1.賦值.沒有建立新物件.公用同乙個物件 2.淺拷貝.拷貝第一層內容.或copy 3.深拷貝.拷貝所有內容.包括內部的所有.深...