数组实现深拷贝,js复制数组,原数组不变
当使用JavaScript对数组进行操作时,我们经常需要对数组进行备份。下面这篇文章带你了解JavaScript数组中的深度复制和浅层复制,希望对你有帮助!
介绍数组的深复制与浅复制,首先给大家回顾回顾数据类型
数据类型
1,基本数据类型:数字字符串布尔值null未定义
存储方式:基本数据类型存储在栈内存。
存储的变量是值2。引用数据类型:函数数组对象(将在下一部分介绍)。
存储方式:参考数据类型存储在堆内存。
存储的变量是地址。【相关推荐:javascript学习教程】至于存储方式我们来分析分析:
我先给大家介绍一下堆栈内存和堆内存,作为理解:
堆栈内存:引擎在执行代码时工作的内存空间。除了引擎之外,它还用于保存基本值和引用类型值的地址。
堆内存:用于存储一组无序且唯一的引用类型值,可以通过使用堆栈中的键名来获得。
让我们再看一遍:
var a=2;
var b=a;
b;//3
console . log(a);//2分析,把A的值赋给B,然后改变B的值,A的值不受影响。但是提到数据类型,就不是这样了。地址已分配。
var arr=[1,2,3];
var arr2=arr
arr 2 . push(4);
console . log(arr);//arr已更改。分析,arr复制地址。地址是什么?可以比作一个房间。arr和arr2都指向这个房间。如果改变这个房间的结构,arr和arr2都会受到影响。如下图
了解上面后,接着重点
深复制与浅复制
数组的浅层复制:只复制地址(共享地址)数组;深层复制:复制值
遍历(将原数组中的值存储到新数组中)var arr 2=[];
Slice()截取数组中的所有值,并获取一个新数组。
就是在堆内存中开辟一个新的空间。数组的浅复制:
仅复制了地址(共享地址)。
var arr=[1,2,3,4,5];
//数组的浅表副本-只复制地址
var arr2=arr
//改变其中一个数组,两个数组都会改变。浅抄还是很好理解的。
数组的深复制:
复制数组中的值
1.定义一个新的空数组,遍历原数组并将其赋给新数组。
var arr=[1,2,3,4,5]
var arr 3=[];
arr.forEach(函数(v) {
按下
})
console . log(arr 3);
arr 3 . push( a );
console.log(arr,arr 3);//arr [1,2,3,4,5],arr 3 [1,2,3,4,5, a]改变新数组中的值,原数组不会改变。
2,slice()截取数组中的所有值,得到一个新的数组。
var arr 3=arr . slice();
console . log(arr 3);
arr 3 . push( a );
console . log(arr 3);//[1,2,3,4,5, a]
console . log(arr);//[1,2,3,4,5]改变新数组中的值,原数组不会改变。
在这里提一嘴:
基本数据类型传递值,引用数据类型传递地址(形参和实参共享地址)。
难点难点,多维数组的深复制,以上提到的都是一维数组的深复制和浅复制
二维数组:二维数组本质上是以数组为数组元素的数组,即“数组的数组”,例如:arr=[[1,2,3],[1,2],[1,2,3,4]]
分析下面这段代码,是二维数组的遍历。变量I,J表示,即下标I的元素(即数组)中的第J个元素。
var arr=[
[1, 2, 3],
[4, 5, 6],
[2, 3, 4]
]
for(数组中的变量I){
for(arr[I]中的变量j){
console . log(arr[I][j]);
}
}多维数组:三维及以上数组
多维数组的深复制
多维数组的深度复制不像一维数组那么容易判断,因为你无法再次判断数组中的元素是否是数组。数组里面有无穷无尽的数组,哈哈,所以需要用前面提到的递归。
使用的方法:Array.isArray(arr[i])判断数组并返回一个布尔值。
思路:判断多维数组的元素是否是数组。如果是,继续遍历数组。如果没有,可以利用一维数组的判断实现深度复制。
脚本
var arr=[1,2,3,4,[5,6,[7,8]];
var arr 2=arr . slice();
函数deepArr(arr) {
var new arr=[];
for(var I=0;长度;i ) {
//newArr.push(arr[i])有可能这个arr[i]还是一个数组。
if(array . isarray(arr[I]){
//继续遍历数组,或者获取一个数组
var list=deepArr(arr[I]);
//然后将获得的数组放入newArr
newArr.push(列表)
}否则{
new arr . push(arr[I]);
}
}
返回newArr
}
var RES=deepArr(arr);
决议[4]。push( a );
console . log(RES);//更改
console . log(arr);//没有变化
/script更多编程知识请访问:编程视频!以上文章带你分析JavaScript数组中深度复制和浅层复制的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。