【前端自学(5)】直接赋值 浅拷贝 深拷贝

本文详细讲解了直接赋值、浅拷贝和深拷贝的区别,通过实例展示了它们在对象复制时的行为。重点介绍了如何使用Object.assign()实现浅拷贝,以及自定义深拷贝函数来处理复杂对象的递归过程。阅读本文将帮助你理解引用类型和基本类型在复制中的不同作用。


1 直接赋值 浅拷贝 深拷贝

  • 直接上实例
//定义一个比较复杂的对象
let o = {
  id: 1,
  name: 'john',
  msg: {
    age: 18,
    msgarr: [10, 30],
  },
  complex: [
    {
      complexa: 30,
      complexarr: [1, 2, { oa: 2, ob: 3, oc: [4, 6] }],
    },
    {
      complexb: 10,
      complexc: 5,
    },
    1,
  ]
}

//直接赋值 a和o指向同一个地址
let a = o

//浅拷贝 浅拷贝只会赋值对象的非对象属性
let b = {}
Object.assign(b, o) //等同于let b = {...o}

//深拷贝 会从堆内存中开辟一个新的区域存放新对象,新对象跟原对象不再共享内存 用的递归思想
function deepCopy (newobj, oldobj) {
  for (let i in oldobj) {
    let item = oldobj[i]
    if (item instanceof Array) {
      newobj[i] = []
      deepCopy(newobj[i], item)
    }
    else if (item instanceof Object) { //引用类型分两种 数组和对象
      newobj[i] = {}
      deepCopy(newobj[i], item)
    } else {
      newobj[i] = item
    }
  }
}
//深拷贝
let c = {}
deepCopy(c, o)

//测试
o.id = 2
console.log(a.id) //2
console.log(b.id) //1
console.log(c.id) //1

o.msg.age = 20
console.log(a.msg.age) //20
console.log(b.msg.age) //20
console.log(c.msg.age) //18

o.complex[2] = 1000
console.log(a.complex[2]) //1000
console.log(b.complex[2]) //1000
console.log(c.complex[2]) //1

o.complex[0].complexarr[2].oc[1] = 100
console.log(a.complex[0].complexarr[2].oc[1]) //100
console.log(b.complex[0].complexarr[2].oc[1]) //100
console.log(c.complex[0].complexarr[2].oc[1]) //6

console.log(c)
/*{
  id: 1,
  name: 'john',
  msg: { age: 18, msgarr: [ 10, 30 ] },   
  complex: [
    { complexa: 30, complexarr: [Array] },
    { complexb: 10, complexc: 5 },        
    1
  ]
}*/

2 总结

建议仔细区分这三个词,以及区分引用类型和基本类型。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值