物件的淺拷貝和深拷貝

2022-08-17 04:18:18 字數 1885 閱讀 6101

拷貝就是複製,淺拷貝和深拷貝也就是淺複製和深複製。

網上關於淺拷貝和深拷貝的內容有很多,原理就不再多贅述了。

一言以蔽之,所謂淺拷貝就是一層複製,所謂深拷貝就不僅僅是一層複製,還可以多層複製

淺拷貝去複製基本型別值是沒什麼問題的,但是遇到了陣列、物件這些引用型別值就沒轍了。

為什麼沒轍了呢?因為對於這些引用型別值而言,淺拷貝的這一層複製只能複製乙個引用位址

而深拷貝則解決了這個問題,對於引用型別值,它可以多層複製,而非僅僅複製乙個引用位址。

下面是淺拷貝和深拷貝的常用方法。

function shadowcopy(source) ;

for (let i in source)

} return target;

}

分析:for-in迴圈是專門用來遍歷物件的可列舉屬性的,但是請注意:它會遍歷整條原型鏈。

所以要通過物件的例項方法hasownproperty(keyname)來篩選只在當前例項中的屬性。

這一步就保證了複製的純淨。

let sourceobj = ;

let cloneobj = {};

object.assign(cloneobj, sourceobj);

注意:這個方法會返回乙個新物件。而且如果有重複屬性,那麼後乙個物件會覆蓋前乙個物件的重複屬性。

let sourceobj = ;

let cloneobj = ;

let sourceobj = ;

let cloneobj = json.parse(json.stringify(sourceobj));

先引入lodash庫,隨便找個cdn:

使用:

let sourceobj = ;

let cloneobj = _.clone(sourceobj);

引入jq庫:

使用:

let sourceobj = ;

let cloneobj = $.extend(false, {}, sourceobj);

(1) array#slice()

(2) array#concat()

(3) [...sourcearr]

(4) array.from(sourcearr)

說明:#表示例項,array#slice()就是陣列例項的方法。

function deepcopy(source) ;

for(let key in source) else

}} return target;

}

分析:對於引用型別值,無非是陣列和物件,所以事先要對源物件進行乙個檢查,這裡直接用array.isarray()。

然後進行一層一層的判斷,如果當前一層是基本型別值那麼直接複製就行了,如果是物件的話,那就做乙個遞迴即可。

把屬性值當做乙個源物件去遞迴返回的物件再賦值給當前的鍵。

如此反覆,化繁為簡,攻克多層物件,這就是乙個能夠想得通的解決思路。

let sourceobj = ,

},};let cloneobj = _.clonedeep(sourceobj);

let cloneobj = $.extend(true, {}, sourceobj);

物件的淺拷貝和深拷貝

淺拷貝 1.用for迴圈獲取引用物件的屬性和值,賦值給新物件 object.prototype.num 1 person1 function clone origin,target for var key in origin return tar var person2 clone person1 ...

物件的淺拷貝和深拷貝

淺拷貝 python拷貝一般都是淺拷貝。拷貝時,物件包含的子物件內容不拷貝。因此,源物件和拷貝物件引用同乙個物件 深拷貝 使用copy模組的deepcopy函式,遞迴拷貝物件中包含的子物件。源物件和拷貝物件所有的子物件也不同 變數的數值操作 只是形成兩個變數,實際上時指向同乙個物件 測試淺拷貝和深拷...

物件的深拷貝和淺拷貝

引用資料型別的名稱是存在棧記憶體中,值存在堆記憶體中,在棧內會存在乙個引用的位址指向堆記憶體中的值 淺拷貝 深拷貝 實現淺拷貝的方法 1 assign let copyobj object.assign obj 只有第一層不聯動,深層的還是聯動的 2 concat var copyarr arr.c...