先考慮一種情況,對乙個已知物件進行拷貝,編譯系統會自動呼叫一種建構函式——拷貝建構函式,如果使用者未定義拷貝建構函式,則會呼叫預設拷貝建構函式。
執行結果:呼叫一次建構函式,呼叫兩次析構函式,兩個物件的指標成員所指記憶體相同,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.深拷貝.拷貝所有內容.包括內部的所有.深...