淺拷貝:指向被複製的記憶體位址,如果原位址裡的值發生改變,那麼淺拷貝出來的值也會發生改變。
深拷貝:開闢一塊新的記憶體位址,存放複製出來的物件。如果原位址裡的值發生改變,那麼對深拷貝出來的物件沒影響。
陣列的淺拷貝:concat,slice,[…],array.from,object.assign(,arr)
物件的淺拷貝:object.assign({},obj),
深拷貝:json.parse(json.stringify())不能拷貝函式,_.clonedeep
let arr =
;let obj =
}let deep =
json
.parse
(json
.stringify
(arr));
//下面幾個實現一維陣列的深拷貝,一維物件的深拷貝,總的來說他們實現的是淺拷貝
let concat = arr.
concat()
;let slice = arr.
slice()
;let extend =
[...arr]
;let
from
= array.
from
(arr)
;拷貝可列舉的物件,
let assign = object.
assign([
], arr)
;let assignobj = object.
assign
(, obj)
; arr[0]
.width =
200;
obj.key.value =2;
console.
log(
"deep:"
, deep)
;//;
console.
log(
"concat:"
, concat)
;//;
console.
log(
"slice:"
, slice)
;//;
console.
log(
"extend:"
, extend)
;//;
console.
log(
"from:"
,from);
//; console.
log(
"assign:"
, assign)
;//;
console.
log(
"assignobj:"
, assignobj)
;// }
//自定義深拷貝
function
deepcopy
(obj):
for(
let key in obj)
else}}
else
return newobj
}
名稱
和原資料是否指向同一物件
原資料為基本資料型別
原資料中包含子物件賦值是
改變會使原資料一同改變
改變會使原資料一同改變
淺拷貝否
改變不會使原資料一同改變
改變會使原資料一同改變
深拷貝否
改變不會使原資料一同改變
改變不會使原資料一同改變
「淺拷貝」與「深拷貝」
c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...
淺拷貝與深拷貝
淺拷貝 1 2 myclass a,b a b 為了封裝性和解耦,同型別的兩個物件之間進行賦值操作時,所有成員變數被複製,包括私有成員 指標變數。類的成員函式在傳遞或返回物件時都會進行物件複製產生臨時物件,比如函式呼叫時實參變為形參,以及函式返回物件。考慮到效能和使用者要求不同,編譯器不複製物件內部...
「淺拷貝」與「深拷貝」
c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...