javascript深拷贝是初学者,甚至是有经验的开发者,都会经常遇到问题,并不能很好地理解javascript的深拷贝。深拷贝(deepClone)?与深拷贝相反的是浅拷贝。很多初学者在接触到这个概念的时候都非常的迷茫。为什么要使用深拷贝?很多时候我们需要给变量赋值,给内存地址赋值,但是在给引用值类型赋值的时候,我们只是共享一块内存区域,这就导致了赋值。该值保持一致。看一个具体的例子//给test赋值一个对象vartest={a:'a',b:'b'};//给test2赋值//此时test和test2共享同一个内存对象,这样是浅拷贝vartest2=test;test2.a='a2';test.a==='a2'//说明为真:这个很好理解为什么引用值类型数据会相互影响。实现一个深拷贝功能,就不得不说javascript的numeric类型。判断javascript类型javascript有如下基本类型类型说明undefinedundefined类型只有一个值undefined,就是变量没有赋值时的值nullnull类型也只有一个值null,也就是空对象引用BooleanBoolean有两个optionsValuestrue和falseString表示文本信息Number表示数字信息Object是一系列属性的无序集合,包括函数Function和数组Array无法使用typeof判断函数和数组,这里使用Object.prototype.toString方法。默认情况下,每个对象都继承了Object的toString()方法。如果此方法未被对象本身或更接近的上层原型上的同名方法覆盖(遮蔽),则调用对象的toString()方法将返回“[objecttype]”,其中字符串类型表示对象类型functiontype(obj){vartoString=Object.prototype.toString;varmap={'[objectBoolean]':'boolean','[objectNumber]':'number','[objectString]':'string','[objectFunction]':'function','[objectArray]':'array','[objectDate]':'date','[objectRegExp]':'regExp','[objectUndefined]':'undefined','[objectNull]':'null','[objectObject]':'object'};returnmap[toString.call(obj)];}implementdeepClone对于非引用值类型的值,直接赋值,而对于引用值类型(object),则需要再次遍历,递归赋值。函数deepClone(data){vart=type(data),o,i,ni;if(t==='array'){o=[];}elseif(t==='object'){o={};}else{returndata;}if(t==='array'){for(i=0,ni=data.length;i
