【武汉分院第一百五十八期】如何实现数组深拷贝与浅拷贝?

1.背景介绍

在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,也就是复制、克隆或者说做拷贝要弄明白拷贝,首先要明白js中对象的组成。在js中一切实例皆是对象,具体分为原始类型和合成类型。原始类型对象指的是number、string、boolean等,合成类型对象指的是array、object以及function。数组的拷贝有深有浅,下面具体分析!

2.知识剖析

浅拷贝

浅拷贝可以理解为就是复制一份来引用,所有引用对象都指向一份数据,并且都可以修改这份数据。对于字符串类型,浅拷贝是对值的拷贝,对于对象来说,浅拷贝是对对象地址的拷贝,也就是复制的结果是两个对象指向同一个内存地址,修改其中一个对象的属性,则另一个对象的属性也会改变,简单讲就是,浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象。举个例子,一个人一开始叫张三,后来改名叫李四了,可是还是同一个人,不管是张三缺胳膊少腿还是李四缺胳膊少腿,都是这个人倒霉。

深拷贝

深拷贝则是复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。深复制不同于浅复制,它会开辟新的内存地址,两个对象对应两个不同的地址,修改 一个对象的属性,不会改变另一个对象的属性,就是说,深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。举个例子,一个人名叫张三,后来用他克隆了另外一个人,叫李四,不管是张三缺胳膊少腿还是李四缺胳膊少腿都不会影响另外一个人

3.常见问题

如何实现数组的深拷贝和浅拷贝?

4.解决方案

实现浅拷贝   :简单的赋值引用就行了

实现数组深拷贝:

1,数组里不包含引用类型的值时可以用slice和concat这两个方法

2,数组里包含引用类型的值时可以用使用

5.编码实战

var arr = ["One","Two","Three"];

var arrtoo = arr.slice(0);

arrtoo[1] = "set Map";

console.log(arr);//One,Two,Three

console.log(arrtoo);//One,set Map,Three

var arr1 = ["One","Two","Three"];

var arrtooo = arr1.concat();

arrtooo[1] = "set Map To";

console.log(arr1);//One,Two,Three

console.log(arrtooo);//One,set Map To,Three

var arry=['1','b','c',['你','我',"它"]],text;

console.log(arry)

text=JSON.parse(JSON.stringify(arry))

console.log(text)

text[3][0]="真丑"

console.log(arry)

console.log(text)

6.拓展思考

数组有哪些常用的方法?

join() 方法用于把数组中的所有元素放入一个字符串。元素是通过指定的分隔符进行分隔的。返回一个字符串。

ArrayObj.push():就是向数组末尾添加新的元素,返回的是数组新的长度。

ArrayObj.pop():就是向数组中删除数组最后一个元素并且返回该元素。如果数组为空就返回undefined。

reverse()方法会对反转数组项的顺序

sort()方法按升序排列数组——即最小的值位于最前面,最大的值排在最后面。

7.参考文献

参考一:http://www.jb51.net/article/49065.htm  数组的拷贝

参考一:http://web.jobbole.com/82517/  原始数据类型和对象类型的区别及深度拷贝解析

8.更多讨论


数组的深拷贝与浅拷贝_腾讯视频


PPT:https://ptteng.github.io/PPT/PPT/js-02-wuhan-copy.html#/

日报:http://www.jnshu.com/daily/22691?uid=9716

推荐阅读更多精彩内容