# 浅拷贝和深拷贝

# 概念

浅拷贝是拷贝引用地址,而非这个地址指向的堆内存中的值,拷贝后的对象改变后,源对象也跟着变。

深拷贝是拷贝堆内存的值,拷贝后的对象改变后,源对象不变。

# 实现深拷贝的方法

  • 递归去拷贝所有层级的属性
function deepClone(obj){
  let objClone = Array.isArray(obj) ? [] : {};
  if(obj && typeof obj === 'object'){
    for(let key in obj){
      if(obj.hasOwnProperty(key)){
        //判断obj属性是否为对象 如果是,递归赋值
        if(obj[key] && typeof obj[key] === 'object'){
          objClone[key] = deepClone(obj[key]);
        }else{
          objClone[key] = obj[key];
        }
      }
    }
  }
  return objClone;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  • JSON对象来实现,但是对象中的方法无法拷贝
function deepClone(obj){
  return JSON.parse(JSON.stringify(obj));
}
1
2
3
  • lodash函数库
let res = _.cloneDeep(obj);
1
  • 使用Object.create(oldObj)
function deepClone(initalObj,finalObj){
  let obj = finalObj || {};
  for(let i in initalObj){
    let prop = initalObj[i];
    if(prop === obj){
      continue;
    }
    if(typeof prop === 'object'){
      obj[i] = (prop.constructor === Array) ? [...prop] : Object.create(prop);
    }else{
      obj[i] = props;
    }
  }
  return obj;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Last Updated: 2/5/2022, 8:55:12 AM