对于浅拷贝和深拷贝的理解
对于浅拷贝的理解
使用js在存入数组或对象是会在浏览器的栈空间存储指向堆空间的指针(及地址),而在堆空间存储真正的内容,访问时通过栈空间的地址来访问;
-
浅拷贝拷贝的是栈空间内存地址,并不是拷贝的内容;
比如:对于数组的拷贝1 var arr=["北京","上海","广州","深圳","成都"] 2 var newArr=arr; 3 newArr[3]="杭州"; 4 console.log(arr);//0:"北京"1:"上海"2:"广州"3 : "杭州" 4 :"成都" 5 console.log(newArr);//0:"北京"1:"上海"2:"广州"3 : "杭州" 4 :"成都"
----更改了一处,但是两个数组都更改了;这种简单的赋值等于知识一种浅拷贝。
-
对于数组深拷贝的方法
-
用数组的slice方法来进行拷贝
-
对于数组的slice方法的使用:
(1)slice方法用于对数组的截取,返回的是一个截取后的数组,语法是:1 arrayObj.slice(starIndex,endIndex)
参数说明:arrayObj--必填项,是需要从该数组中来截取数组;starInex--必填项,表示截取开始的位子的下标;endIndex--选填项,如果该项不填,则从开始位置截取到最后,如果starindex或endinex为负数,那么从结尾开始计数下标。 -
用concat方法,js的concat方法用于连接两个或多个数组,该方法不会改变原有数组,会返回连接后数组的副本,Arrayobj.concat(arrat1,array2,array3,...),该方法会将数组中的元素取出,放入一个新数组中,返回改数组。
1 var arr=[1,2,3,4]; 2 var arr1=["北京","上海"]; 3 var newArr=arr.concat(arr1); 4 5 console.log("原数组:"+arr); 6 console.log("新数组:"+newArr) 7 //返回结果 8 原数组:1,2,3,4 9 新数组:1,2,3,4,北京,上海
-
采用递归函对数组进行深拷贝,如下:
1 var arr=["a","s","d","f"]; 2 function deepCopy(arr,newArr) { 3 newArr=newArr || []; 4 for (var i in arr){ 5 if (typeof arr[i]==="object"){ 6 newArr[i]=arr[i].constructor===Array?[]:{}; 7 deepCopy(arr[i],newArr[i]) 8 }else { 9 newArr[i]=arr[i] 10 } 11 } 12 return newArr 13 } 14 var arr1=deepCopy(arr); 15 arr1[3]="asdfed"; 16 console.log("原数组:"+arr); 17 console.log("新数组:"+arr1); 18 //返回结果 19 原数组:a,s,d,f 20 新数组:a,s,d,asdfed
-
同时也可以用jQuery中的extend属性进行拷贝
-
-
对象的深拷贝的方法:比如以下代码
1 function Test(){ 2 this.name="xiaohong"; 3 this.age=18; 4 this.run=function () { 5 console.log("i can run") 6 } 7 } 8 var test=new Test(); 9 console.log(test.age); 10 test.run(); 11 function NewTest() { 12 this.name="xiaowang"; 13 this.age=20; 14 this.sing=function () { 15 console.log("i can sing") 16 } 17 } 18 NewTest.prototype=new Test(); 19 var children = new NewTest(); 20 children.sing(); 21 children.run(); 22 console.log(children.age); 23 24 console.log('----childre的属性----') ; 25 for (var key in children){ 26 console.log(key) ; 27 } 28 //如果要过滤掉原型上的属性 29 console.log('----childre的属性----') ; 30 for (var key in children){ 31 if(children.hasOwnProperty(key)) { 32 console.log(key); 33 } 34 } 35 //所以对于一个对象的深拷贝 36 var cloneObj={}; 37 for (var key in children){ 38 if(children.hasOwnProperty(key)) { 39 cloneObj[key]=children[key] 40 } 41 }
-
同样也可以用递归的方法对对象进行深拷贝
1 function deepCopy(obj,newObj) { 2 newObj=newObj || {}; 3 for (var i in obj){ 4 if (typeof obj[i]==="object"){ 5 newObj[i]=obj[i].constructor===Array?[]:{}; 6 deepCopy(obj[i],newObj[i]) 7 }else { 8 newObj[i]=obj[i] 9 } 10 } 11 return newObj 12 }
和数组递归方式的深拷贝原理一样
-

浙公网安备 33010602011771号