什么是深拷贝与浅拷贝
我们都知道在Js当中数据类型是分为基本数据类型和引用数据类型,基本数据类型有Number、String 、Boolean、Null、Undefined这里就不一一细说了,我们今天主要来说说引用类型的深拷贝与浅拷贝问题,引用类型Object,主要又分为对象{},和数组[]。
在这里我们又要引入一个知识点,就是栈内存跟堆内存,基本数据类型都是存储在栈内存中的,而引用类型都是存储在堆内存中的,看图
如图所示,栈内存拷贝之后是重新开辟了一个存储空间,而堆内存拷贝则是相当于给予了一个通为堆内存的链接地址,两则之间的内容还是有联系的,如果改变一个值,另一个值也会改变,这样会带来许多不便,这时候我们就需要用深拷贝和浅拷贝这个两个词来解决这个问题。
1、浅拷贝
什么是深拷贝与浅拷贝,简单来讲浅拷贝是只能实现一维数组的拷贝,比如arr=[1,2,3,4,5,6],但是对二维或者多维数组就不行,比如arr=[1,[2,3,4],5,6,7],浅拷贝就不能让数组里的数组[2,3,4]改变两者不影响,而深拷贝就能实现。
var arr1 = [1,2,3,4,5,6,7];
var arr2 = [];
for (var j = 0;j<arr1.length;j++){
arr2.push(arr1[j])
}
console.log(arr2);//[1, 2, 3, 4, 5, 6, 7]
关于浅拷贝如以上代码所示一个简单的for循环就能够实现。
2、深拷贝
实现深拷贝可以套用for循环然后不断递归来实现
function fm(arrx) {
var arry =[];
for (var k = 0;k<arrx.length;k++){
if (typeof arrx[k]==="object"){
arry[k]=new Array();
arry[k] = fm(arrx[k])
}else {
arry[k] = arrx[k];
}
}
return arry
}
var arrx = [[1,2,3],4,5,6,[7,8,[8,8,9]]];
var arr1122 = fm(arrx);
arrx[4][2][0]="ddd";
console.log(arrx);//1,2,3,4,5,6,7,8,ddd,8,9
console.log(arr1122);//1,2,3,4,5,6,7,8,8,8,9
还有的就是用Json来实现
arr1 = [[1,2,3],4,5,6,[7,8,[8,8,9]]];
var arrN = JSON.parse(JSON.stringify(arr1));
这样arrN就重新生成了新的数组了。
还有一种就是用数组的slice的方法
var arr2 =[2,3,1,53,2,5];
var arr3 = arr2.slice(0);
通过切片的方式,arr3生成了一个新数组,数组就是arr2里的内容。