深拷贝的方法

it2023-04-16  74

 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)