引子
什麼是淺拷貝?什麼是深拷貝?淺顯易懂的說:假設b複製了a,如果b發生變化,a也隨之變化,那麼說明為淺拷貝;若b發生變化,並不會導致a也發生變化,則稱之為深拷貝。
舉個例子:
不禁疑惑,陣列b複製了陣列a,明明只修改了陣列b,為什麼陣列a也隨著改變呢?
此時需要引入基本資料型別和引用資料型別的概念
基本資料和引用資料
基本資料型別有哪些?
null,undefined,number,string,boolean,symbol
引用資料型別?
有常規名值對的無序物件,還有陣列
[1,2,3]
和以及函式
有了解過基本資料型別和引用資料型別的儲存方式嗎?
實現深拷貝
遞迴實現深拷貝
//只適用於物件和陣列的深拷貝
function
deepclone(targetobj)
//如果目標物件為引用型別
借用json物件的parse和stringifyfunction某些api所實現的深淺拷貝deepclone(obj)
let obj = }
let copy =deepclone(obj)
copy['name'] = 'john'copy.son.name = 'tom'console.log(obj,copy)
array.prototype.concat()
實現陣列的不完全深拷貝
array.prototype.slice()
實現陣列不完全深拷貝只能實現第一層屬性的深拷貝,原因在於,方法返回乙個新的陣列物件
object.assign()
實現的不完全深拷貝let obj = }let copy = object.assign({}, obj)//
因為方法返回目標物件{},實現了第一層的深拷貝
copy['name'] = 'john'copy.son.name = 'son'//
第二層為淺拷貝了,所以修改copy物件時,obj物件的第二層也改變了
深拷貝的實用性
後台返回一堆資料時,在多人開發中,我們不知道資料是否有其他的開發需求,因此我們不能直接修改資料,深拷貝可以使我們安心操作拷貝的資料,而無需擔心修改原資料帶來的隱性問題。
「淺拷貝」與「深拷貝」
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...