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);