深拷贝与浅拷贝(学习笔记)

基本类型:BooleanNullUndefinedNumberStringSymbol
引用类型:ObjectArrayFunction(深拷贝和浅拷贝)

一维数组的深拷贝

slice()concat()Array.from()

一维对象的深拷贝

Object.assign()

没有undefined函数以及symbol值的对象深拷贝

JSON.parse(JSON.stringify(obj))

递归拷贝

第三方库:

  • JQuery$.extend
  • lodash_.cloneDeep
    原生js:
function deepCopy(obj,parent=null){
  //创建一个新对象
  let result = {};
  let keys = Object.keys(obj);
  let key = null;
  let temp = null;
  let _parent = parent;
  //该字段有父级则需要追溯该字段的父级
  while(_parent){
    //如果该字段引用了它的父级则为循环引用
    if(_parent.originalParent === obj){
      //循环引用直接返回同级的新对象
      return _parent.currentParent;
    }
    _parent = _parent.parent;
  }
  for(let i=0;i<keys.length;i++){
    key = keys[i];
    temp = obj[key];
    //如果字段的值也是一个对象
    if(temp && typeof temp === 'object'){
      //递归执行深拷贝 将同级的待拷贝对象与新对象传递给parent方便追溯循环引用
      result[key] = deepCopy(temp,{
        originalParent:obj,
        currentParent:result,
        parent:parent
      });
    } else {
      result[key] = temp;
    }
  }
  return result;
}
var obj1 = {
  x:1,
  y:2
};
obj1.z = obj1;
let obj2 = deepCopy(obj1);
console.log(obj1);
console.log(obj2);
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值