关于对象的深浅拷贝

对象的浅拷贝

网上的版本:(我觉得这种方式不太对)
function notDeepCopy(obj) {
    let result = obj instanceof Array ? [] : {}
   for (let key in obj) {
      result[key] = obj[key]
   }
   return result
}
let obj = {a:1, b: {c: 6, d: [{e:1}]}}
newObj = notDeepCopy(obj)
newObj.b.c = 100
console.log(obj, newObj)

运行结果:{ a: 1, b: { c: 100, d: [ [Object] ] } } { a: 1, b: { c: 100, d: [ [Object] ] } },可以看到newObj中的c改变了,obj中的c也跟着改变了。但是要是我改变的是a,结果是obj中的a并不会跟着改变,我的理解是因为它有往里面遍历了一层,所以里面那层还是值类型的赋值,所以这层还是深拷贝,如果再往里一层赋值那就不一样了。其实浅拷贝直接newObj=obj这样就ok了吧,就不会出现那个问题

对象的深拷贝:

第一种方式

function deepCopy(obj) {
   let result = obj instanceof Array ? [] : {}
   for (let key in obj) {
      result[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key] // 如果是值类型就直接赋值,如果还是引用类型那么继续递归下去
   }
   return result
}
let obj = {a:1, b: {c: 6, d: [{e:1}]}}
newObj = deepCopy(obj)
newObj.b.c = 100
console.log(obj, newObj)

运行结果:{ a: 1, b: { c: 6, d: [ [Object] ] } } { a: 1, b: { c: 100, d: [ [Object] ] } }  可看到newObj中的值变化并未影响到obj

第二种方式:

let obj = {a:1, b: {c: 6, d: [{e:1}]}}
let newObj = JSON.parse(JSON.stringify(obj))
newObj.b.c = 100
console.log(obj, newObj)

运行结果:{ a: 1, b: { c: 6, d: [ [Object] ] } } { a: 1, b: { c: 100, d: [ [Object] ] } }
 

关于object.assign的深浅拷贝  https://blog.csdn.net/lpf1215/article/details/77856971可以参考一下这位,大概意思就是用object.assign能实现根节点深拷贝,但再往里就是浅拷贝。

如果有哪里写的不对求大佬们指出谢谢!!!

猜你喜欢

转载自blog.csdn.net/a151913232/article/details/86580454