javascript中的深度复制
javascript的深度副本是由初学者甚至有经验的人开发的,他们经常会遇到问题,所以不能很好地理解JavaScript的深度副本。
什么是深度克隆?与深拷贝相对应的是浅拷贝。一开始我不明白。
在很多情况下,我们需要给变量和内存地址赋值。然而,在赋值引用值类型时,我们只共享一个内存区域,这导致赋值时与以前的值保持一致。
看一个具体的例子
//一个对象var test={a: 'a ',b: 'b'}被分配给test;//将test分配给test2//此时,test和test2共享同一个内存对象,这是var test2=test的浅拷贝;test2.a=' a2Test.a==='a2'//为真,如下所示:
这使得很容易理解为什么引用值类型数据会相互影响。
要实现深度复制功能,你必须说javascript的数字类型。让我们首先看看js有哪些数据类型:
类型描述未定义未定义的类型只有一个未定义的值,这是未分配变量时的值。null类型也只有一个值,它是空对象的引用。布尔布尔有两个值:真和假字符串类型数字类型。包括整数和浮点数对象,它是一系列属性的无序集合,包括函数和数组。使用typeof无法判断函数和数组,使用instanceof会在多个iframe中出现错误。我们可以使用Object.prototype.toString方法,可以判断各种类型。
默认情况下,每个对象都从该对象继承toString()方法。如果此方法没有被对象本身或更高级原型上同名的方法覆盖(隐藏),则对象的toString()方法将返回[对象类型],其中字符串类型表示对象类型。
我们先写一个类型函数,用来判断下一个深度副本中的类型:
函数类型(obj){ var toString=object . prototype . toString;var map={ '[Object Boolean]' : ' Boolean ','[object Number]' : 'number ','[object String]' : 'string ','[Object Function]' : ' Function ','[object Array]' : 'array ','[object Date]' : 'date ','[Object RegExp]' : ' Undefined ','[Object Null]' 33333330返回映射[ToString . call(obj)];}现在很清楚如何实现深度复制。非引用类型的值直接赋值,而引用类型(对象)的值需要遍历几次并递归复制。
函数deepClone(数据){ var t=type(数据),o,I,ni;if(t===' array '){ o=[];} else if(t==' object '){ o={ };}else {返回数据;} if(t==='array') { for (i=0,ni=data.lengthi niI){ o . push(DeepClone(data[I]);}返回o;} else if(t==' object '){ for(I in data){ o[I]=DeepClone(data[I]);}返回o;}}有一点大家要注意。对于函数类型,是直接赋值还是与内存值共享?这是因为函数更多的是完成某些功能,有输入值和返回值,对于上层业务来说,更多的是完成业务功能,不需要对函数做深度复制。
轻拷贝,对于轻拷贝来说,可以理解为只操作一个公共内存区域!这里会有危险!
如果直接操作共享数据,不控制,经常会得到异常数据,被其他部分更改。因此,我们不应该直接对数据源进行操作,而是封装一些方法对数据进行凝乳操作。
这里几乎一样,但是作为前端,我们不仅要考虑javascript本身,还要考虑dom、浏览器等等。
元素类型,看看下面的代码,结果会返回什么?
对象。原型。tostring。调用(文档。getelementsbytagname(' div ')[0])经过测试,返回的是:[对象HTMlDiverElement]
有时候保存了数字正射影像图元素,一不小心进行深拷贝,上面的深拷贝函数就缺少了对元素元素的判断。而判断元素元素要使用实例f来判断。因为对于不同的标签,toString会返回对应不同的标签的构造函数。
函数类型(obj){ var toString=object。原型。toStringvar map={ '[Object Boolean]' : ' Boolean ','[object Number]' : 'number ','[object String]' : 'string ','[Object Function]' : ' Function ','[object Array]' : 'array ','[object Date]' : 'date ','[Object RegExp]' : ' Undefined ','[Object Null]' 3333333330 if(元素的obj实例){ return '}返回映射[ToString。调用(obj)];}感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!