js 深拷贝+浅拷贝
- JS数据类型
1.基本类型(栈数据)
String、Number、Boolean、undefined、null
2.引用类型(堆数据)
Object(常用的包括Function、Array、Date、RegExp等)
PS:堆和栈的区别:
值类型是存在栈里的,存取速度都很快。
栈的特点:先进后出,类似羽毛球桶,先放进去的羽毛球,要想拿出来,必须先把后放进去的羽毛球拿出来。
引用类型的真实数据存在堆里。
堆的特点:堆就像一个仓库,随机存,直接取,没有像栈这么麻烦。栈中只保存了引用地址,真实数据其实存在堆里,如果想要获取真实的数据,就要通过引用地址去堆里找。
- 深浅拷贝
深拷贝和浅拷贝都只针对引用数据类型,浅拷贝会对对象逐个成员依次拷贝,但只复制内存地址,而不复制对象本身,新旧对象成员还是共享同一内存;深拷贝会另外创建一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
区别:浅拷贝只复制对象的第一层属性,而深拷贝会对对象的属性进行递归复制。
1.浅拷贝
浅拷贝的方法:Object.assign()、slice、concat、ES6的...扩展符均为浅拷贝
2.深拷贝
深拷贝的方法:
(1)JSON.parse(JSON.stringify(obj)),缺点是无法对function进行操作
原理:用JSON.stringify()将对象转成字符串,再用JSON.parse()把字符串解析成对象。(会在堆内存开辟一个新的空间存放这个对象)
(2)遍历对象对子项赋值来进行深拷贝(一定要考虑到对象中有引用对象的情况)
参考链接:https://www.jb51.net/article/192518.htm
https://blog.csdn.net/qq_39353677/article/details/105222873