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