数组的拷贝

作者: avery1 | 来源:发表于2018-01-29 18:10 被阅读36次

前面已经有过对象的拷贝一文

对象的拷贝

我们再来看下数组的拷贝

方法来源stackflow

Copying array by value in JavaScript

首先我们要明确一个问题就是,对于javascript里的数据类型,基本数据类型(string,number,boolean)的赋值是真的赋值操作,而引用数据类型(Object)赋值的是内存地址。undefined和null在这里就不讨论了。

基本类型的赋值

那么有些时候我们需要对引用数据类型的赋值然后操作的时候直接赋值,会导致对赋值对象的操作也会引起原对象的改变。这里我们来看数组的操作。

数组的复制操作

可以看出,新数组的修改,也会导致数组的变化。所以有些时候需要我们对数组进行拷贝。

1、循环,还是万能的循环

基本类型的数组 引用类型的数组

我们可以看出基本类型的数组简单的for循环还是没问题,又跟对象拷贝的一样了。对于基本的push操作这种拷贝是够用的。在深层的拷贝自己实现去吧,这里就不写了。

2、slice

slice方法是分割数组的方法,两个可选参数是起始位位置和结束位置。当不写参数的时候可以实现基本的拷贝操作,这个也是比较常用的数组拷贝方法。

继续使用上面定义的数组对象

slice实现数组拷贝

可以看出slice实现基本的拷贝,也就是基本的push操作还是可以使用的,但是赋值操作就不可以了。

基本数据类型的slice拷贝

基本数据类型的slice拷贝是可以使用没问题的。

3、concat

数组的连接,和自己连接也实现基本的拷贝功能,类似slice()

concat实现数组的拷贝

4、ES6方法

扩展运算符

扩展语句

es6 扩展运算符 三个点(...)

ES6方法拷贝数组

和上面一样的效果。

5、最简单粗暴地方法,转成字符串再转成对象,但是不推荐的方法

parse stringfy

let newArr = JSON.parse(JSON.stringify(arr))

这个绝对是深拷贝的方法。

6、Array.from()

ES6方法  

Array.from()

es6 数组对象新增方法 Array.from()将两类对象转为真正的数组

基本数据类型的操作 引用类型的操作

相关文章

  • 关于几个拷贝的问题

    数组浅拷贝 数组深拷贝 复合数组深拷贝

  • 11_聊一聊js中实现数组拷贝的常用方法

    一、数组赋值 1、要点 用数组直接赋值的方式实现数组的拷贝,改变拷贝后的数组的元素,被拷贝的数组的元素也会发生改变...

  • 浅拷贝与深拷贝

    /*浅拷贝:拷贝地址*/ /*深拷贝:拷贝对象*/ 用Strong修饰不可变数组:浅拷贝 用Copy修饰不可变数组...

  • lodash中常用的方法

    lodash会拷贝一份新数组,不会对之前的数组进行影响 数据的基础处理 浅拷贝&&深拷贝 数组的分割,将数组(ar...

  • javascript 杂记

    数组杂记 1)数组的判断,使用Array.isArray() 2)一维数组的深拷贝 3)多维数组的深拷贝 4)数组...

  • Javascript深拷贝

    什么是深拷贝 创建一个新的对象或数组时,将原对象/数组的“值”拷贝,而不是“引用”。 深拷贝 数组拷贝不存在多层嵌...

  • 关于OC中数组的深、浅拷贝的小总结

    简而言之:数组的深拷贝,仅仅只是拷贝数组的内容,数组内元素的地址不会变,如果想要数组内的对象元素也深拷贝,则数组内...

  • js的深浅拷贝

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

  • 关于 CopyOnWriteArrayList 的一个简单优化

    一、优化动机 COW 简介:增删改都会加锁并拷贝工作数组,在拷贝数组上做完增删改操作后,会把拷贝数组切换为工作数组...

  • Android Gradle脚本

    定义变量 定义字典 定义数组 打印 遍历数组拷贝文件+重命名 拷贝文件夹 拷贝+修改文件内容

网友评论

    本文标题:数组的拷贝

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