博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重新梳理下js中的深拷贝和浅拷贝
阅读量:7047 次
发布时间:2019-06-28

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

参考链接:

浅拷贝:

1.最简单的浅拷贝就赋值。

由于js中的对象都是复杂数据类型,这种数据在内存中存储的时候,存放在堆中。当简单赋值的时候,其实是将该对象的指针指向同一个堆地址。

简单的数据类型存放在栈中,当对简单的数据类型进行赋值的时候,其实就是直接在栈中新开辟一个地方专门来存储一样的值。

所谓的浅拷贝就是,后面的对象和前面的对象在第一层数据结构中指向同一个堆地址。但是如果前面的数据不止有一层,如:

let obj = { a: {a: "hello", b: 21} };

此时,使用Object.assign()和...Object方式实现的都是浅拷贝。

此时,第一层数据虽然指向了另一个新的堆地址,但是它内部的子对象的指针却还是同一个地址。这种情况也属于浅拷贝,只不过是比那种直接赋值(直接复制堆地址)的方式要深刻一些。

2.数组和对象的浅拷贝

数组的浅拷贝,有三种方式:

(1) arr1 = arr2;(2) arr2 = arr1.slice(0);(3) arr2 = arr1.concat();

对象的浅拷贝,也有3种方式:

(1) obj2 = obj1;(2) obj2 = Object.assign(obj1 ,{} )(3) obj2 = {...obj1}

深拷贝

对象的深拷贝实际上就是,将前一个对象复制一份给后面的那个对象,不管前面的那个对象中的数据结构嵌套有多深,当改变其中一个对象中的任意深度的某个值后,另一个对象中的该值不会受任何影响。

1.当对象中的所有属性值都是简单数据类型的时候:

function easyCopy(p) {  var c = {};  for (var i in p) {    c[i] = p[i];    }  c.uber = p;  return c;}

2.当要复制的对象中存在某个属性的value值是对象或者数组时:

如果像上面的简单类型那样直接赋值,那么子对象对应的属性实际上指向的是和被拷贝对象中子对象一样的内存地址。因此,只要改了一个,另一个也会跟着改变。

function deepCopy(p, c) {    let c = c || {};    for (let i in p) {        if(! p.hasOwnProperty(i)){            continue;        }        if (typeof p[i] === 'object') {            c[i] = (p[i].constructor === Array) ? [] : {};            deepCopy(p[i], c[i]);        } else {            c[i] = p[i];        }    }    return c;}Parent = {name: 'foo', birthPlaces: ['北京','上海','香港']}var Child = deepCopy(Parent);

总结:

浅拷贝:你变我也变,嵌套对象变,就会跟着变。
深拷贝:管你怎么变,互不影响。

转载地址:http://cdkol.baihongyu.com/

你可能感兴趣的文章
重庆健全养老服务体系 2018年新增社区养老服务站200所
查看>>
2018年贵州各项存款增速回落明显 贷款增速居全国第一
查看>>
一团伙在列车上利用“斗地主”诈骗 作案313起涉案42万
查看>>
找Android漏洞赢奖金,去年共递交450多份合格漏洞报告
查看>>
掘金 AMA:听 Vue.js 作者--尤雨溪谈 Vue.js & 独立开发 & 设计那些事
查看>>
BCH新开发者平台Developer.bitcoin上线,加速BCH应用开发
查看>>
LeetCode算法系列,持续更新中...
查看>>
localtime函数的死锁风险
查看>>
英伟达AI:修图软件千千万,效果最牛的还是我这款
查看>>
Java常用数据结构之List
查看>>
如何优雅使用Docker?请收下这15个快捷有效的小技巧
查看>>
MaxCompute重装上阵 第五弹 - SELECT TRANSFORM
查看>>
Web开发模式【Mode I 和Mode II的介绍、应用案例】
查看>>
一次生产的JVM优化
查看>>
RecyclerView的使用总结以及常见问题解决方案
查看>>
本地方法怎么映射Java层的数据类型
查看>>
自定义view之实现日历界面(一)
查看>>
如何实现 font-size 的响应式
查看>>
【从零开始学习Oracle数据库】(3)函数与子查询和连接查询
查看>>
给 Android 开发者的一点福利:免费模拟面试
查看>>