js 深拷贝,浅拷贝?

前言:所谓的深拷贝和浅拷贝都是应用于应用对象类型来说的,因为基础类型赋值的时候直接赋值的值;

问题由来:由于业务的复杂,我们声明的基础fields对象层次太多,大概长下面这样?

export const bussinessBaseCreateConfig = {
   title: '1 基本信息',
   type: 'Base',
   fields: [
      {
         label: '申请人',
         name: 'applier',
         type: 'SelectApplier',
         layout: { ...bussinessLayout, rules: [{ required: true, message: '请选择申请人' }] },
         configs: { workflowId: '16' }
      },
      {
         label: '申请日期',
         name: 'applyDate',
         type: 'Input',
         layout: { ...bussinessLayout },
         configs: { readOnly: true, placeholder: '自动带出' },
      },
      {
         label: '联系方式',
         name: 'applyPhone',
         type: 'Input',
         layout: { ...bussinessLayout },
         configs: { readOnly: true, placeholder: '自动带出' },
      },
   ],
};

发现问题:

然后触发了一个问题就是我每次重新打开一个fields的时候都会携带上次的数据,

使用Object.assign({},fields)会出现以下问题,只能还原第一层的值,更里面的值没法还原,

其实都知道js里面引用对象的值没法赋值,赋值给别的变量会出现问题,导致一些数据会出现问题,

深拷贝)解决方式:

  • 使用最简单的方式就是JSON.stringify(),然后通过JSON.parse()进行解码,简单的解决我们的问题,
  • 想要更加完美的解决我们的问题,我们就需要进行自定义拷贝方法,递归去遍历没一项,然后进行修改,
function deepClone(source){
  const targetObj = source.constructor === Array ? [] : {}; // 判断复制的目标是数组还是对象
  for(let keys in source){ // 遍历目标
    if(source.hasOwnProperty(keys)){
      if(source[keys] && typeof source[keys] === 'object'){ // 如果值是对象,就递归一下
        targetObj[keys] = source[keys].constructor === Array ? [] : {};
        targetObj[keys] = deepClone(source[keys]);
      }else{ // 如果不是,就直接赋值
        targetObj[keys] = source[keys];
      }
    } 
  }
  return targetObj;
}

(浅拷贝)解决方式:

  • concat
  • slice
  • Object.assign();
  • rest参数...
posted @ 2020-12-08 17:03  程序員劝退师  阅读(94)  评论(0编辑  收藏  举报