数组实现深拷贝,js复制数组,原数组不变

  数组实现深拷贝,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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: