深拷贝

1.递归

function deepCopy(a) {
  let cloned = Array.isArray(a)? [] : {};
  if(a && typeof a === "object") {
    for (let i in a) {
      if(a.hasOwnProperty(i)) {
        if(a[i] && typeof a[i] === "object") {
          cloned[i] = deepCopy(a[i])
        } else {
          cloned[i] = a[i]
        }
      }
    }
  }
  return cloned
}

let a = [1,2,3]
b = deepCopy(a)
a[0] = 2 
console.log(a,b);  // [2, 2, 3]  [1, 2, 3]

let obj = {
  a: { aa: 2},
  b: 1
}
let objCp = deepCopy(obj);
obj.a.aa = 100;
console.log(objCp); // {a: {aa: 2}, b:1}

2.json

// 无法实现对对象中方法的深拷贝,会显示为undefined
function deepClone(obj) {
  var _obj = JSON.stringify(obj),
  objClone = JSON.parse(_obj);
  return objClone;
}

3.通过jQuery的extend方法实现深拷贝

var array = [1,2,3,4];
var newArray = $.extend(true,[],array); // true为深拷贝,false为浅拷贝

4.lodash函数库实现深拷贝

let result = _.cloneDeep(test)

5.Reflect法

// 代理法
function deepClone(obj) {
    if (!isObject(obj)) {
        throw new Error('obj 不是一个对象!')
    }

    let isArray = Array.isArray(obj)
    let cloneObj = isArray ? [...obj] : { ...obj }
    Reflect.ownKeys(cloneObj).forEach(key => {
        cloneObj[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key]
    })

    return cloneObj
}

 6.slice实现数组的深拷贝

// 当数组里面的值是基本数据类型,比如String,Number,Boolean时,属于深拷贝
// 当数组里面的值是引用数据类型,比如Object,Array时,属于浅拷贝
var arr1 = ["1","2","3"]; 
var arr2 = arr1.slice(0);
arr2[1] = "9";
console.log("数组的原始值:" + arr1 );
console.log("数组的新值:" + arr2 );

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值