当前位置: 首页 > Web前端 > JavaScript

Javascript深拷贝分歧总结

时间:2023-03-27 00:13:53 JavaScript

JavaScript的深拷贝是什么深拷贝和浅拷贝按照ECMAScript标准,数据类型可以分为两类,一类是原始数据类型,一类是对象(Object)。原始数据类型有七种:UndefinedNullNumberStringBooleanSymbolBigIntObject(Object):凡是能和new一起创建的类型都是对象类型,比如Map、Array、Date等,也就是说所有的对象不属于原始数据类型的,在复制JS时,会根据不同的数据类型表现出不同的特征。深拷贝和浅拷贝是根据拷贝后对象类型的不同效果来区分的。一般来说,只有对象类型才有深拷贝和预拷贝的区别。为什么只有object类型需要区分deepcopy和Shallowcopy对于原始数据类型,在复制的时候,复制前后的两个变量是两个不相关的数据。它将创建一个新的内存地址来存储这两个数据。对于对象数据类型,当它进行浅拷贝时,拷贝的两个对象指向同一个内存地址。当进行深拷贝时,会开辟一个新的内存地址来存放可??变数据。所以深拷贝和浅拷贝的区别在于拷贝时是否会开辟一个新的内存地址来存放对象类型。如何进行浅拷贝,浅拷贝有什么特点?完全浅拷贝2.特点:由于两个变量指向同一个内存地址,并且都指向同一个对象,当任何一个副本修改数据时,所有被复制的变量中的值都会改变。如何进行深拷贝,深拷贝有什么特点方法:使用JSON。之前和之后的两个对象没有关系。当修改其中一个变量时,不会影响另一个变量。深拷贝的两种方式有什么区别?方法一:JSON.parse(JSON.stringify(obj))可以简单的实现对象的深拷贝。当要复制的对象obj中的值不属于原来的数据类型时,就不能很好的复制。不支持拷贝undefined、function、Date等,只能完成原始数据类型的深拷贝方式。二:根据拷贝的需要,使用typeofinstanceof和递归,以及拷贝的构造函数returnobject,第一步已经排除了为null的情况,剩下的就是不需要处理的数据类型if(typeofobj!=='object')returnobjif(objinstanceofDate)returnnewDate(obj)if(objinstanceofRegExp)returnnewRegExp(obj)constcloneObj=newobj.constructor();//keepinheritancechainfor(constkeyinobj){if(obj.hasOwnProperty(key)){cloneObj[key]=obj[key]}}returncloneObj}深拷贝思维发散几个问题问题1.什么是内存地址2.JSON.stringify和JSON.parse()3.typeofinstanceof4.递归