美文网首页IT修真院-前端
【武汉分院第一百五十八期】如何实现数组深拷贝与浅拷贝?

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

作者: 听话快到碗里来 | 来源:发表于2017-05-11 10:02 被阅读0次

    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

    相关文章

      网友评论

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

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