博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深浅拷贝的解决方案
阅读量:5218 次
发布时间:2019-06-14

本文共 2540 字,大约阅读时间需要 8 分钟。

复制基本数据类型不会有什么问题,但是如果是引用数据类型,就会相互之间影响。

一般在数据结构比较简单的情况下,使用浅拷贝就可以达到需求,如果数据结构比较复杂,就必须使用深拷贝。

 

浅拷贝:

  第一种: 使用 for...in来进行浅拷贝

var book = {        name: 'JS修炼'    }       var obj = {}     for (var v in book) {        obj[v] = book[v]    }    book.name = '我是book'

  第二种: 使用Object.assign进行浅拷贝 

var book = {        name: 'JS修炼'    }       var obj2 = Object.assign({},book)

在修改了book里面的数据后,不会影响到新拷贝的数据,这样就实现了浅拷贝

但是在使用浅拷贝的时候,如果对象里面还包含别的引用类型,那么如果修改这里面的对象,就会影响到拷贝的数据

var book = {        name: 'JS修炼',        list: {            a: '我是a',            b: '我是b',            c: '我是c'        }    }       var obj = {}     for (var v in book) {        obj[v] = book[v]    }    var obj2 = Object.assign({},book)    book.name = '我是book'    book.list.a = '我是修改book'

得到的结果,会影响拷贝到的数据

 

深拷贝:

第一种:将数据转为字符串的形式然后再进行解析

var book = {        name: 'JS修炼',        list: {            a: '我是a',            b: '我是b',            c: '我是c'        }    }       var obj = JSON.parse(JSON.stringify(book));    book.name = '我是book'    book.list.a = '我是修改book'    console.log(book,'book')    console.log(obj,'obj')

这种确实比较简单的实现了深拷贝,但是存在一个问题,不能去拷贝function,或者是空的

第二种: 递归的方式进行深拷贝

  简单的递归方式

var book = {        name: 'JS修炼',        age: '',        age2: undefined,        list: {            a: '我是a',            b: '我是b',            c: '我是c'        },        function () {  }    }      function copy (obj) {        var o = {}        for (var i in obj) {            if (typeof obj[i] === 'object') {                o[i] = copy(obj[i])            } else {                o[i] = obj[i]            }        }        return o;    }    var obj2 = copy(book)    book.name = '我是book'    book.list.a = '我是修改book'    console.log(book,'book')    console.log(obj2,'obj2')

这样简单的递归方式就实现了深拷贝,但是这样写存在一个问题,对数组无法做到处理

完整的代码如下

var book = {        name: 'JS修炼',        age: '',        age2: undefined,        list: {            a: '我是a',            b: '我是b',            c: '我是c'        },        author:['作者1','作者2'],        author2:[            {                value: '我是author2'            }        ],        function () {  }    }    function clone (obj) {        var vv = null;        if (typeof obj == 'object' && obj !== null) {            vv = obj instanceof Array ? [] : {}            for (var v in obj) {                vv[v] = clone(obj[v])            }        } else {            vv =obj        }        return vv;    }    var obj3 = clone(book)    book.name = '我是book'    book.list.a = '我是修改book'    book.author[0] = 'w'    book.author2[0].value = 'w'

 

转载于:https://www.cnblogs.com/qiuchuanji/p/10012833.html

你可能感兴趣的文章
303. Range Sum Query - Immutable
查看>>
图片加载失败显示默认图片占位符
查看>>
【★】浅谈计算机与随机数
查看>>
[转载]宇宙文明等级的划分标准
查看>>
《代码阅读方法与实现》阅读笔记一
查看>>
解决 sublime text3 运行python文件无法input的问题
查看>>
javascript面相对象编程,封装与继承
查看>>
Atlas命名空间Sys.Data下控件介绍——DataColumn,DataRow和DataTable
查看>>
Java中正则表达式的使用
查看>>
算法之搜索篇
查看>>
新的开始
查看>>
java Facade模式
查看>>
模板的继承和导入 、自定义函数
查看>>
NYOJ 120校园网络(有向图的强连通分量)(Kosaraju算法)
查看>>
SpringAop与AspectJ
查看>>
Leetcode 226: Invert Binary Tree
查看>>
http站点转https站点教程
查看>>
解决miner.start() 返回null
查看>>
关于MFC中窗口的销毁
查看>>
bzoj 2007: [Noi2010]海拔【最小割+dijskstra】
查看>>