深拷贝的实现和浅拷贝

拷贝数据:


基本数据类型:拷贝后会生成一份新的数据,修改拷贝后的数据不会影响原来的数据
数组/对象:拷贝后会不会生成新数据,而是拷贝引用,修改拷贝后的数据会影响原来的数据

拷贝数据的方法:

1.赋值给变量     //浅拷贝
2.Array.propotype.concat()    //浅拷贝
3.Array.proppotype.slice()    //浅拷贝
4.Object.assign()             //浅拷贝 es6提供的浅拷贝方法
5.JSON.parse(JSON.stringify())   //深拷贝(深度克隆)

浅拷贝(对象、数组)
特点:拷贝的是引用,修改拷贝以后的数据影响原来的数据
深拷贝(深度克隆)
特点:拷贝生成新数据,修改拷贝以后的数据不会影响原来的数据

深拷贝实现:
拷贝的数据里不能有对象、数组,如果有就可以继续遍历对象、数组拿到里面的每一项值,一直到拿到的是基本数据类型,然后再去赋值,就是深度拷贝

//判断数据的类型
function chechType(target){
  return Object.propotype.toString.call(target).slice(8,-1)
}
function clone(target){
  //声明两个变量,一个接收克隆的数据,一个接收被克隆数据的类型
  //先定义接收克隆的数据的类型或简单类型就直接赋值
  let result, targetType=checkType(target);
  if(targetType === 'Object'){
    result={};
  }else if(targetType === 'Array'){
    result=[]
  }else{
    // 简单类型数据直接返回,相当于已克隆完成
    return target
  }
  // 遍历目标数据,还需判断目标数据里面的值的类型,
  // 1.如果值的类型是对象或数组,就要重新判断值的类型,形成递归,则调用自己
  // 2.如果值的类型是简单类型,就赋值给result的相对应的key或下标
  for(let i in target){
    let value=target[i];
    result[i]=clone(value);
  }
  // 最后返回克隆好的数据
  return result
}

 let arr=[1,3,4,{name:'df',child:[{name:'dd'},{name:'rr'}]}]
 let arr2=cloneTarget(arr)
 console.log(arr2,arr);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值