1、最简单的浅拷贝:
let arry = [1,2,3,4,5];
let arry2 = arry;
arry[0] = 5;
arry2[1] = 100;
console.log(arry,arry2); //
修改了arry第一个数据后,发现arry2的第一个数据也被改变;
修改了arry2第一二个数据后,发现arry的第二个数据也被改变;
浅层次拷贝,数组是复合的数据类型,直接复制的话,只是复制了指向底层数据结构的指针,而不是克隆一个全新的数组,所以这里修改谁,都会直接影响另一个值(es6)
2、利用数组方法完成深拷贝
a.数组的连接 concat 方法, slice(0)方法,push(),方法详解可以去看一下w3school教程
let arry = [1,2,3,4,5];
let arry2 = arry.concat();
此时再去修改
arry[0] = 5;
arry2[1] = 100;
与第一个浅拷贝的列子不同,哪怕是修改了arry的值,arry2的第一个值也没有变化
同样的arry2修改了第二个值,arry第二个值没有发生改变。
slice是裁剪原数组成为新数组,let 新数组名 = 旧数组.slice(0);就搞定
push() 是要用循环调用,遍历数组每一个元素,使之成为新数组
b.转换法,涉及es6的解构赋值
let arry = [1,2,3,4,5];
let arry2 = Array.of(...arry);
let arry3 = [...arry]; 或者 let [...arry3] = arry;
//将一组值转换为数组,此处存在两层转换,首先解构赋值将数组转换成一个个的参数(可以去了解一下函数与数组的解构赋值应用),传入到Array.of()这个方法中,再由这个方法将这些数值转成新数组,效果是一样的。arry3 深拷贝原理也类似,将atty解构后,重新赋值给arry3,注意数组中括号不能丢.
c.上述方法只能将一维数组进行深拷贝,要想对数组中所有内容都进行深拷贝,就需要使用一下递归,也就是套娃模式。
附代码,自学随笔记录。
// 多维嵌套的数组(这里是四维)
let bigArry = [1,2,3,4,[5,6,[7,8],[9,10,[11,12]]],[13,14]];
// 创建一个函数
function copyDeep(arry) {
//新建一个空数组
let newArry = [];
//遍历你要拷贝的数组
for (let i = 0; i < arry.length; i++) {
if (Array.isArray(arry[i])) {
newArry[i] = copyDeep(arry[i])
} else {
// 这个就是子元素不是数组的元素的处理,直接深拷贝一次就行
newArry[i] = arry[i];
}
}
return newArry;
}
let x = copyDeep(bigArry);
bigArry[4][2][0] = 1000;
x[4][2][1] = 99;
console.log(x, bigArry);