JS实现深拷贝

JS实现深拷贝

  • 思路:判断传入的类型,创建空数组或对象>>>创建myCopy用于递归调用,分析属性值或项的类型>>>如果值为基本类型值则返回,是对象或数组则递归调用myCopy进一步分析>>>返回拷贝的结果。
function deepCopy(obj) {
  //判断拷贝后的结果是数组还是对象
  let copy = Object.prototype.toString.call(obj) === '[object Object]'? {} : [];
  //用于递归调用,深度遍历
  function myCopy(list) {
    let result;
    //判断传入类型,是对象则对每一个属性值进行递归调用
    if (Object.prototype.toString.call(list) === '[object Object]') {
      for(let key in list) {
        result = {};
        result[key] = myCopy(list[key]);
      }
       //数组则对每一项进行递归调用
    } else if (Object.prototype.toString.call(list) === '[object Array]') {
        result = list.map(item  => myCopy(item))
    } else {
      //如果是基本类型值,则直接返回
      return list;
    }
    return result
  }
  copy = myCopy(obj);
  return copy;
}
  • 测试:
let myData = [{age: '0',data: [1,0,0]},1,2,3,[5,6,7]];
let copyData = deepCopy(myData);
//修改部分引用类型值
copyData[0]['age'] = '666';
copyData[0]['data'][0] = 0;
copyData[4][0] = 6;
copyData[4][2] = 6;
console.log(myData,copyData);//拷贝的对象age值变为666,原始对象依旧是0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值