淺拷貝:淺拷貝是將物件的每個屬性進行依次複製,當物件的屬性值是引用型別,實質複製的是其引用,指向的值改也會跟著變化,淺拷貝只拷貝一層
深拷貝:深拷貝複製變數值,對於非基本型別的變數,則遞迴至基本型別變數後,在複製,深拷貝後的物件與原來的物件是完全隔離的,互不影響,深拷貝是層層拷貝
淺拷貝**操作:
簡單的object.assign()拷貝方法:
拷貝方法
//拷貝
a =; b = object.
assign
(,a)
; b.name =
"李四"
;//拷貝完之後進行改變屬性,測試拷貝的屬性值改變原資料是否改變。
console.
log(a,b)
;//輸出:
(拷貝成功)
//拷貝[ ]
a =["1"
,"2"
,"3"];
b = object.
assign([
],a)
; b[1]
="hello"
; console.
log(a,b)
//輸出:["1","2","3"]
["1"
,"hello"
,"3"
](拷貝成功)
//for in拷貝方法
varcopy
=function
(a)}
return res;
}
a =};
b =copy
(a);
b.people.name=
"hello"
; a =
["a"
,"b"
,"c"
];b =
copy
(a);
b[1]
=0;//拷貝完之後進行改變屬性,測試拷貝的屬性值改變原資料是否改變。
console.
log(a,b)
//輸出:["a","b","c"]
["a"
,"0"
,"c"
](拷貝成功)
深拷貝(完美拷貝):
① 如果是基本資料型別,直接返回;
② 如果是regexp或者data型別,返回對應型別;
③ 如果是複雜資料型別,遞迴;
④ 考慮迴圈引用的問題。
function
deepclone
(obj,hash =
newweakmap()
)if(hash.
has(obj)
)//如果obj是陣列,那麼 obj.constructor 是 [function: array]
//如果obj是物件,那麼 obj.constructor 是 [function: object]
let t =
newobj.constructor()
; hash.
set(obj,t)
;for
(let key in obj)
}return t;
}var show =
, age:
null
, pic:undefined,
}var show2 =
deepclone
(show)
;show2.name=
"mary"
console.
log(show,show2)
//拷貝成功,完美拷貝
淺拷貝和深拷貝的區別:
淺拷貝只能複製物件或陣列的第一層屬性,而深拷貝是拷貝多層,每一級的資料都會被拷貝出來。
理解「淺拷貝」和「深拷貝」
淺拷貝 將原物件 原陣列 的 引用 直接賦給新物件 新陣列 新物件 新陣列 是原物件 原陣列 的乙個引用。如果改變這個新物件 新陣列 原物件 原陣列 就會改變。深拷貝 將原物件的各項屬性的 值 陣列的所有元素 都拷貝給新物件 新陣列 是拷貝的 值 而不是 引用 為什麼要使用深拷貝?希望改變新物件 新...
淺拷貝 深拷貝的再次理解
以前對淺拷貝的認識不夠,認為只是對指標的賦值,沒有真實的開闢空間。看了一篇部落格後感覺自己的認識還不夠,其實淺拷貝還會導致記憶體洩漏!對,你沒看錯,確實是 記憶體洩漏!最後會把部落格鏈結貼出來。我們以前對淺拷貝深拷貝的理解是這樣的 淺拷貝是對指標的拷貝,拷貝以後兩個指標指向的是同一塊記憶體空間,深拷...
深拷貝和淺拷貝的理解
為什麼要使用深拷貝和淺拷貝?當你想複製乙個物件時,一般做法是obj2 obj1,但是當你改動obj2的時候,會影響到obj1,而obj1也會影響到obj2,所以需要深拷貝和淺拷貝來解決物件的直接賦值仍然 連線 的問題。淺拷貝 複製乙份引用,讓所有引用物件指向乙份資料,並且可以修改這份資料,即只對指標...