浅谈javascript深拷贝和浅拷贝

浅拷贝:拷贝基本数据类型时,不受任何影响,当拷贝引用类型时,源对象也会被修改。
深拷贝:深拷贝就是完完全全拷贝一份新的对象,它会在内存的堆区域重新开辟空间,修改拷贝对象就不会影响到源对象

     // 基本类型
     let a = 10;
     let b = a
     b =100
     console.log("a=",a) // a=10
     console.log('b=',b) // b =100
     // a是原始值,原始值是不能修改的,只能另外开辟内存地址来存储存的数据
    // 引用类型对象(这里是实现了浅拷贝)
    let c = {name:"邓紫棋"}
    let d = c
    d.name="周杰伦"
    console.log("c.name=",c.name) //  c.name= 周杰伦
    console.log('d.name=',d.name) //  d.name= 周杰伦
  //数组
  //1.concat()(这里实现了深拷贝)
   const n =['你好','周杰伦']
  //  concat方法创建并返回一个新的数组,新数组包含调用concat方法放入数组的元素
   const j = [].concat(n) 
   j.push('你好','邓紫棋')
   console.log('n=',n) // n= (2) ["你好", "周杰伦"]
   console.log('j=',j) //j= (4) ["你好", "周杰伦", "你好", "邓紫棋"]
   
  //2.slice() 方法(这里实现了深拷贝)
    const k =['你好','周杰伦']
    const i = k.slice() 
    k.push('你好','邓紫棋')
    console.log('k=',k) //k= Array(4)[0: "你好" 1: "周杰伦" 2: "你好" 3: "邓紫棋"]
    console.log('i=',i)//i= Array(2)[0: "你好" 1: "周杰伦"]
    
 //3. Array.from() 方法(这里实现了深拷贝)
    const n =['你好','周杰伦']
    const j = Array.from(n)  
    j.push('你好','邓紫棋')
    console.log('n=',n) // n= Array(2)[0: "你好" 1: "周杰伦"]
    console.log('j=',j) // j= Array(4)[0: "你好" 1: "周杰伦" 2: "你好" 3: "邓紫棋"]
  
//4. 展开运算符
   const p = [{name:'周杰伦'}]
   const o = [...p]
   o[0].name = '邓紫棋' 
   console.log('p=',p) // 邓紫棋
   console.log('o=',o) // 邓紫棋  
   // 这块要实现深拷贝可以使用JSON.stringify()和JSON.parse()方法
      const p = [{name:'周杰伦'}]
      const o = JSON.parse(JSON.stringify(p))
      o[0].name = '邓紫棋' 
      console.log('p=',p) // 周杰伦
      console.log('o=',o) // 邓紫棋  
 // map().filter(),redue()这些都可以造成浅拷贝的,不过可以用JSON来解决
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未央区邓紫棋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值