简单深拷贝

let obj = {c:1,d:()=>{}}
    obj_ = {a:1,b:2}
    obj__ = {a:()=>{},b:()=>{},c:1}
    _obj = [1,2,3,1]
    _obj_= 1

// 深拷贝
// JSON.parse(JSON.stringify())
// 局限性:

// 他无法实现对函数 、RegExp等特殊对象的克隆
// 会抛弃对象的constructor,所有的构造函数会指向Object
// 对象有循环引用,会报错

 let o = JSON.parse(JSON.stringify(obj)) 

 console.log(o)//{c:1}

//遍历 递归
// 对数据类型做判断

const deepClone = (obj)=>{
  let o = {} //存结果
  //判断是否为复杂类型(引用类型)
  if(typeof obj === 'object' && obj !== null ){
  //数组处理
    if(Array.isArray(obj)){
       o = [...obj]
    }
    //对象处理
    for(let item in obj){
      if(obj.hasOwnProperty(item)){
        o[item] = deepClone(obj[item])
      }else{
        o = {...obj}
      }
    }
  }else{
     o = obj //普通类型
  }
  return o
}

// deepClone(obj)
console.log(deepClone(obj))//{ c: 1, d: [Function: d] }
console.log(deepClone(obj_))//{ a: 1, b: 2 }
console.log(deepClone(obj__))//{ a: [Function: a], b: [Function: b], c: 1 }
console.log(deepClone(_obj))//[ 1, 2, 3, 1 ]
console.log(deepClone(_obj_))//1

//精简
const deepClone_simple = (obj) =>{
 let o = {}; 
 //普通类型
 (typeof obj !== 'object' || obj === null)&&(o = obj);
 //复杂类型
 //数组
 Array.isArray(obj)&&(o = [...obj]);
 for(let item in obj){
 obj.hasOwnProperty(item)&&(o[item] = deepClone_simple(obj[item]));
 }
 return o;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值