深拷贝的方法

 1.JSON.parse()和JSON.stringify()可以实现深拷贝,但是有一定的缺陷;

let obj1 = {
  a: 'hell0',
  b: function () { console.log('嘻嘻!') },
  c: new RegExp('\\w+'),
  d: new Date(1536627600000),
};
let obj2 = JSON.parse(JSON.stringify(obj1));
console.log(obj1);
console.log(obj2);

控制台打印的数据可以看出, 利用这种方法obj1被深拷贝的obj2对象中,function会被丢失(undefined也会)、RegExp会被序列化成空对象、时间格式被序列化成字符串。另外,如果对象中含有循环引用的元素,无法实现深拷贝;如果对象的元素是构造函数,则会丢失元素的constructor;对象中的元素如果是NaN、Infinity和-Infinity,则序列化的结果会变成null。

 2.concat可以实现简单数组的深拷贝,但是对于多层的数组不可以。

 let array1=[1,2,3,4,5];
 let array2=array1.concat();
 array2[2]=88;
 console.log(array1);
 console.log(array2);

let array1=[{name:'lili',age:12},{name:'xiaoxiao',age:10}];
let array2=array1.concat();
array2[1].age=11;
array2[1].name='liangliang';
console.log(array1);
console.log(array2);

 3.Object.assign()可以实现单层对象的深拷贝,但是对于多层对象不适用;

    let obj1={name:'zhangLi',age:16,height:'160cm',weight:'43kg'}
    let obj2=Object.assign({},obj1);
    obj2.age=14;
    obj2.name='zhouzhou';
    console.log(obj1);
    console.log(obj2);

 

 

let obj1={like:{play:true,write:true}}
let obj2=Object.assign({},obj1);
obj2.like.play=false;
console.log(obj1);
console.log(obj2);

 

 4、针对上面的深拷贝方法多多少少会有不完善的地方,总结出以下方法,如有不对,欢迎指正。

 deepClone(originData) {
    const that = this;
    let result;
    if (typeof originData === 'object') {
      if (Array.isArray(originData)) {
        result = [];
        for (let i in originData) {
          result.push(that.deepClone(originData[i]));
        }
      } else if (originData === null) {
        result = originData;
      } else if (originData===RegExp) {
        result = originData;
      }else{
        result={};
        for(let i in originData){
          result[i]=that.deepClone(originData[i]);
        }
      }
    } else {
      result = originData;
    }
    return result;
  },


    let obj1={a:'hell0',b:function(){console.log('嘻嘻!')},c:{left:1,right:2}};
    let obj2=this.deepClone(obj1);
    obj2.b=99;
    console.log(obj1.b);
    console.log(obj2.b);

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值