淺拷貝和深拷貝
1.淺拷貝
通過迴圈,將a物件的屬性和方法拷貝給b屬性,但是由於拷貝時a物件內部的引用資料型別時,其值為堆裡該引用資料型別的地址值,所以會造成a、b兩個物件中的引用資料型別指向堆中同一塊記憶體地址,這會造成牽一髮而動全身,改動a的引用資料型別會導致b中的該值也受到牽連。
var a = {
name:"objectaaaaa",
go:function(){
console.log("這是物件a的方法")
},
another:{
name:"不知道"
},
have:[1,2,5,6]
}
var b = {}
for(var key in a){
b[key] = a[key]
}
a.name = "wwwwqq"
a.another.name = "hahah"
console.log("a",a)
console.log("b",b)
2、深拷貝
通過遞迴的方式對物件的引用資料型別當作一個新的物件再進行淺拷貝再賦值,這樣就可以確保二者的地址值指向堆中地址不一樣。
var a = {
name:"objectaaaaa",
go:function(){
console.log("這是物件a的方法")
},
another:{
name:"不知道"
},
have:[1,2,5,6]
}
var b = {}
// for(var key in a){
// b[key] = a[key]
// }
function deepCopy(a,b){
for(var key in a){
if(a[key] instanceof Array){
b[key] = []
deepCopy(a[key],b[key])
}else if(a[key] instanceof Object){
if(a[key] instanceof Function){
b[key] = a[key]
}else{
b[key] = {}
deepCopy(a[key],b[key])
}
}else{
b[key] = a[key]
}
}
}
deepCopy(a,b)
a.name = "wwwwqq"
a.another.name = "hahah"
console.log("a",a)
console.log("b",b)
b.go = function(){
console.log("this is b")
}
b.go()
a.go()
相關文章
- 深拷貝和淺拷貝
- iOS深拷貝和淺拷貝iOS
- js 深拷貝和淺拷貝JS
- JavaScript淺拷貝和深拷貝JavaScript
- Java深拷貝和淺拷貝Java
- 物件深拷貝和淺拷貝物件
- JavaScript深拷貝和淺拷貝JavaScript
- js 淺拷貝和深拷貝JS
- 淺拷貝&深拷貝
- python 指標拷貝,淺拷貝和深拷貝Python指標
- 淺探js深拷貝和淺拷貝JS
- go slice深拷貝和淺拷貝Go
- js之淺拷貝和深拷貝JS
- ECMAScript-淺拷貝和深拷貝
- C++淺拷貝和深拷貝C++
- 深度解析深拷貝和淺拷貝
- JavaScript之深拷貝和淺拷貝JavaScript
- js的深拷貝和淺拷貝JS
- 聊聊物件深拷貝和淺拷貝物件
- java深克隆(深拷貝)和淺克隆(淺拷貝)Java
- 淺拷貝與深拷貝
- 淺談深拷貝與淺拷貝?深拷貝幾種方法。
- js實現深拷貝和淺拷貝JS
- VUE 中 的深拷貝和淺拷貝Vue
- 對淺拷貝和深拷貝的理解
- JS深拷貝與淺拷貝JS
- python深拷貝與淺拷貝Python
- Python淺拷貝與深拷貝Python
- javascript 淺拷貝VS深拷貝JavaScript
- 淺談Java中的淺拷貝和深拷貝Java
- 深入淺出深拷貝與淺拷貝
- Javascript知識點:淺拷貝和深拷貝JavaScript
- javaScript深拷貝和淺拷貝簡單梳理JavaScript
- 【Python】直接賦值,深拷貝和淺拷貝Python賦值
- Python擴充套件_淺拷貝和深拷貝Python套件
- js 陣列的淺拷貝和深拷貝JS陣列
- [JS系列二]談談深拷貝和淺拷貝,如何實現深拷貝JS
- 深拷貝、淺拷貝與Cloneable介面