如何深浅拷贝数组(总结)

作者: 顽皮的雪狐七七 | 来源:发表于2018-03-06 20:34 被阅读175次

这两天遇到了一个问题,如何复制数组,所以就从各个地方找了很多的解决办法。算是整理一下,这样以便于自己以后的学习:

【TOC】目录

  • 浅拷贝数组
  • 深拷贝数组
    • 1.使用数组遍历赋值
      • 原理
      • 代码实现
    • 2.返回新数组方法
      • 2.1 使用slice方法
        • 原理
        • 代码实现
      • 2.2 使用数组map方法
      • 2.3 使用concat方法
    • 3.ES6语法实现深拷贝
    • 4.for-in连原型链也一并复制的方法
    • 5.多维数组的复制

浅拷贝数组

首先第一个复制数组我们都想到的是定义一个数组直接相等就可以了:

  var arr1 = [1,2,3];
  var arr2 = arr1;
  arr1[0] = 2;
  console.log(arr1[0]);  //2

出现这个的原因就是因为,数组是用堆去保存的,所以这个算是浅拷贝,相等的时候只是把存放的地址拷贝过去了,两个指向了同一个地址,所以在改变其中一个的值,其他的也跟着改变了。
所以如何深拷贝一个数组呢?

深拷贝数组

1.使用数组遍历赋值

原理

这个是最原始的办法,就是把每个值取出来到另一个数组中。

代码实现

  var arr1 = [1,2,3];
  var arr2 = [];
  arr1.forEach(function(value,index){
    arr2[index] = value;
  }) 
  console.log(arr2);
//这个时候改变arr1[0]  = 3;那么输出arr2[0]还是等于1

2. 返回新数组方法

2.1 使用slice方法

原理

数组的slice方法是截取数组的意思,在之前的数组总结中也有提过。
slice(0)指的是从0开始到末尾截取数组,然后返回一个新的数组,这样就不会影响到原来的数组了。

代码实现
  var arr1 = [1,2,3];
  var arr2 = arr1.slice(0);
  console.log(arr2); //[1,2,3]
//这个时候改变arr1[2] = 5,那么输出arr2[2]还是等于3

顺着这种方法是不是得到了思维的开阔,来看看还有哪些是返回新数组的?

2.2使用数组map方法

使用map方法遍历数组然后返回新的数组,里面的值不变

  var arr1 = [2,3,4];
  var arr2 = arr1.map(function(value){
    return value;  
  })
  console.log(arr2);  //[2,3,4]

2.3使用concat方法

连接数组,如果连接的是一个空,那么也是返回了新的本身的数组

  var arr1 = [3,4,5];
  var arr2 = arr1.concat();
  console.log(arr2);   //[3,4,5]

3.ES6语法实现深拷贝

ES6扩展运算符实现数组的深拷贝,目前是最简单的。

  var arr = [1,2,3,4,5];
  var [ ... arr2 ] = arr;
  console.log(arr); //[1,2,3,4,5]
  console.log(arr2); //[1,2,3,4,5]

4.for-in连原型链也一并复制的方法

这种办法,不仅复制的值,还会把属性也进行拷贝。

var arr = [1,2,3,4,5];
arr.prototype = 5;
var arr2 = [];
for(var a in arr){
  arr2[a] = arr[a];
}
console.log(arr2); // [1,2,3,4,5]
console.log(arr2.prototype); // 5
//之前的方法中新数组的prototype都是undefined

5.多维数组的复制

原理

多维数组转化为字符串会成为一维数组。

  var arr = [[1,2],3,4,[5,6]];
  var arr1 = arr.toString().split(",")
  var arr2 = arr.join().split(",")
  console.log(arr1) //[1,2,3,4,5,6]
  console.log(arr2) //[1,2,3,4,5,6]

但是怎么可以保持那种二维数组的状态呢?需要下面的代码

代码实现

  var arr = [[1,2],3,4,[5,6]];
  var arr3 = JSON.parse(JSON.stringify(arr));  
  console.log(arr3) // [[1,2],3,4,[5,6]]

如果你有新的方法欢迎留言?如果我找到新的方法会不定期更新...

©burning_韵七七

相关文章

  • js的深浅拷贝

    js的深浅拷贝可以分为数组的深浅拷贝和对象的深浅拷贝 一、数组的深浅拷贝如果只是简单的将数组中的元素付给另外一个数...

  • 如何深浅拷贝数组(总结)

    这两天遇到了一个问题,如何复制数组,所以就从各个地方找了很多的解决办法。算是整理一下,这样以便于自己以后的学习: ...

  • 数组、深浅拷贝

    如何判断数组类型 typeof ❌对Array不起作用,会将结果判断为object,同理null instance...

  • JS文集的目录

    js基础心法 深浅拷贝(递归)深浅拷贝(首层浅拷贝) js 数据处理 数组对象查找的常见操作数组对象去重的常见操作...

  • 深浅拷贝

    深浅拷贝针对的是 对象类型,如果是字符串的数组用[...arr],还是不会影响 要区分针对数组的深浅拷贝(默认情况...

  • 数组的深浅拷贝

    像上面直接赋值的方式就是浅拷贝,但很多时候这并不是我们想要的结果,其实我们想要的是a数组不变,不是吗? 方法1:s...

  • JS对象和数组深浅拷贝总结②

    在实际开发中遇到过太多次深拷贝浅拷贝的问题。总结一下~ JS数据存储和深浅拷贝实际运用① 这是之前写过的一篇文章,...

  • 重新认识js复杂类型数据的引用和深浅拷贝

    js 基本概念———— 数据类型 js 深浅拷贝之概念 代码实现 —— 数组和对象的j浅拷贝 代码实现 —— 数组...

  • 放进收藏夹,省下时间睡觉!

    1. 数组去重 2. 深浅拷贝 浅拷贝 深拷贝 假深拷贝 真深拷贝 3. 事件委托 5. 使用push和apply...

  • js深浅拷贝

    所谓的深浅拷贝是相对与typeof === 'object' 而言的,数组是用堆对应保存的。浅拷贝:拷贝了对象的存...

网友评论

    本文标题:如何深浅拷贝数组(总结)

    本文链接:https://www.haomeiwen.com/subject/tiprfftx.html