发表于: 2017-05-10 17:58:09

1 805


                           如何实现数组深拷贝与浅拷贝?

1.背景介绍

  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

<code>
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
</code>

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.更多讨论



返回列表 返回列表
评论

    分享到