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参数...