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
网友评论