淺拷貝與深拷貝

2022-05-03 19:39:15 字數 856 閱讀 4032

js 中有個重要的型別叫做引用型別。這種型別在使用的過程中,因為傳遞的值是引用,所以很容易發生一些***,比如:

let a = 

let b =a

b.age = 2

上述**的寫法會造成ab的屬性都被修改了。大家在日常開發中肯定不想出現這種情況,所以都會用上一些手段去斷開它們的引用連線。對於上述的資料結構來說,淺拷貝就能解決我們的問題。

方法一:...運算子

let a = 

let b =

b.age = 2

方法二:object.assign

let a = 

let b = object.assign(a)

但是淺拷貝只能斷開一層的引用,如果資料結構是多層物件的話,淺拷貝就不能解決問題了,這時候我們需要用到深拷貝。

深拷貝的做法一般分兩種:

第一種:json.stringify

原理:是將物件轉化為字串,而字串是簡單資料型別。

這種寫法非常簡單,而且可以應對大部分的應用場景,但是它還是有很大缺陷的,比如拷貝其他引用型別、拷貝函式、迴圈引用等情況。

第二種:遞迴拷貝

function

deepclone(source); //

判斷複製的目標是陣列還是物件

for(let keys in source);

targetobj[keys] =deepclone(source[keys]);

}else

}}

return

targetobj;

}

「淺拷貝」與「深拷貝」

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...