關於深拷貝與淺拷貝

2021-09-25 06:51:41 字數 1174 閱讀 1304

相關理解

注意:閉包中的變數存在在堆記憶體中而非棧記憶體中。

賦值與淺拷貝

array.prototype.slice實現對陣列的淺拷貝

array.prototype.concat將陣列和陣列或和值連線在一起成新的陣列

…擴充套件運算子

實現淺拷貝

原理:新的物件複製已有物件中非物件屬性的值和物件屬性的引用。

function shadowclone(sources) ;

for (var key in sources)

} return target;

}

深拷貝:

會拷貝乙份一模一樣的物件,從堆記憶體中開闢乙個新的區域存放新物件,新物件與原物件不共享記憶體,修改新的物件不會改變原物件。

例項:

json.parse()/json.stringify()

json.stringify()把一物件序列化成乙個json字串,將物件的內容轉換成字串的形式再儲存在磁碟上,在用json.parse()反序列化json字串成為乙個新的物件。【不可處理函式】

注意:

第三方深拷貝庫lodash中_.clonedeep()

實現深拷貝

原理:運用遞迴思想,遍歷物件和陣列直到裡面所有為基本資料型別,然後再去複製。

//定義檢測資料型別的功能函式

function isobject(obj)

function clonedeep(source)

var target = array.isarray ? : {};

for (var key in source) else

})}}

賦值、淺拷貝與深拷貝區別:

操作和原資料是否指向同一物件

第一層資料為基本資料型別

原資料中包含子物件賦值是

改變使原資料一同改變

改變使原資料一同改變

淺拷貝否

改變不會使原資料一同改變

改變使原資料一同改變

深拷貝否

改變不會使原資料一同改變

改變不會使原資料一同改變

「淺拷貝」與「深拷貝」

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