淺拷貝,深拷貝

2022-08-20 01:12:07 字數 1847 閱讀 9963

賦值

基本資料型別=> 賦值,賦值之後,兩個變數互不影響

eg: var a=1 b=a  console.log(b) // 1  a=2 console.log(b) //1
引用資料型別=> 賦址,僅改變引用的指標,指向同乙個物件,所以相互之間有影響

eg: var obj=  var obj1=obj console.log(obj1) //  obj.a=3  obj.b=4 console.log(obj1) //
重新在堆中建立記憶體,拷貝前後物件的基本資料型別互不影響,只拷貝一層,不能對物件的子物件進行拷貝

典型的淺拷貝方法 object.assign()

eg:var obj= obj1=new object()  object.assign(obj1, obj)  obj.a=3  console.log(obj1) //  obj1.a=4 console.log(obj) //
淺拷貝方法

var obj=} 

var obj1=obj

function copyobj(obj)

for(var key in obj)

} return qkb;

}var obj2= copyobj(obj)

obj.a="haha"

obj.b.c="wo"

console.log(obj1) // }

console.log(obj2) //}

ob1只是將指標改變,引用的仍然是同乙個物件,而淺拷貝得到的obj2建立了新物件,但是,原物件obj的子物件,則不會對這個子物件淺拷貝,而只是複製其物件的變數位址

=>對物件中的子物件進行遞迴拷貝,拷貝前後的兩個物件,互不影響

1>深拷貝方法 json.parse(json.stringify(obj))

var obj = }

var copy = json.parse(json.stringify(obj))

obj.a.b = 2

console.log(obj) // }

console.log(copy) // }

但是 json.parse()、json.stringify也存在乙個問題,json.parse()和j son.stringify()能正確處理的物件只有number、string、array等能夠被 json 表示的資料結構,因此函式這種不能被 json 表示的型別將不能被正確處理。

var target = 

};var copy = json.parse(json.stringify(target));

console.log(copy); //

console.log(json.stringify(target)); // ""

2> 遍歷實現屬性複製

function deepcopy (source) 

for (var key in source) else }}

} else

return target

}var obj1 = }

var cpobj1 = deepcopy(obj1)

obj1.a.b = 2

console.log(cpobj1) // }

var obj2 = [[1]]

var cpobj2 = deepcopy(obj2)

obj2[0][0] = 2

console.log(cpobj2) // [[1]]

js 資料型別、賦值、深拷貝和淺拷貝

淺拷貝 深拷貝

copy mutablecopy copy 不管是可變的,還是不可變的,結果都是不可變的 mutablecopy 不管是不可變的,還是可變的,結果都是可變的 nsmutablestring str nsmutablestring stringwithformat a nsarray arr1 str...

深拷貝 淺拷貝

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...

淺拷貝 深拷貝

retain是建立乙個指標,引用物件計數加1。copy屬性表示兩個物件內容相同,新的物件retain為1 與舊有物件的引用計數無關,舊有物件沒有變化。copy減少物件對上下文的依賴。retain屬性表示兩個物件位址相同 建立乙個指標,指標拷貝 內容當然相同,這個物件的retain值 1也就是說,re...