JS中的深克隆与浅克隆

  1. JS中的深克隆与浅克隆

浅克隆是原始类型为值传递,对象类型仍为引用传递,与原数据公用一套内存地址,修改一处别的也会受到影响。
深克隆是所有元素或属性完全复制,与原对象完全脱离,也就是说所有对新对象的修改都不会映射到原对象中。

  • JS实现浅克隆
var lilei={
    sname:"li lei",
    sage:12,
    address:{
      city:"xian",
      street:"未央区"
    }
  }
  function clone(oldObj){
    if(oldObj==null){return null};
    if(typeof oldObj!=="Object"){return oldObj}
    var newObj = Array.isArray(oldObj)?[]:{};
    for(var key in oldObj){
      newObj[key] = oldObj[key]
    }
    return newObj;
  }
  var lilei2 = clone(lilei);
  console.log(lilei===lilei2)//true
  console.log(lilei);
  console.log(lilei2)
  lilei2.sname="李雷"
  console.log(lilei.sname);//李雷
  lilei2.address.city="beijing";
  console.log(lilei.address.city);//beijing 很明显原对象的属性值已被修改
  
  • JS实现深克隆
var hmm={
    sname:"han meimei",
    sage:15,
    address:{
      city:"shenzhen",
      street:"林湖区"
    }
  }
  function clone2(oldObj){
    var newObj = Array.isArray(oldObj)?[]:{};
    for(var key in oldObj){
      if(typeof oldObj[key] !=="object"){
        newObj[key]=oldObj[key]
      }else{
        newObj[key]=clone2(oldObj[key])
      }
    }
    return newObj;
  }
  var hmm2=clone2(hmm);
  console.log(hmm,hmm2);
  console.log(hmm===hmm2);//false
  hmm2.sname="韩梅梅"
  hmm2.address.city="xian";
  console.log(hmm.sname);//还是han meimei 原对象没变
  console.log(hmm.address.city);//还是shenzhen 原对象没变

也可以通过第三方库lodash的api如deepClone

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值