JavaScript中存在两大数据类型: 基本类型 和 引用类型
基本类型数据
保存在在栈内存中
引用类型数据
保存在堆内存中,引用数据类型的变量是一个指向堆内存中实际对象的引用,存在栈中
深拷贝和浅拷贝都只针对于引用类型。
一、 浅拷贝
:拷贝的是地址。如下就是一个浅拷贝的方法:
1、拓展运算符
先了解一下Object.assign方法,如下图所示:
简单对象用Object.assign()方法实现浅拷贝如下:这是es6新增的。
2、Object.assign()
总结
:浅拷贝只拷贝一层简单数据类型(即,简单数据类型只会拷贝值),但是对于更深层次的对象,只会拷贝它的地址。
简单理解:浅拷贝,如果拷贝的是单层对象,就没问题,如果有多层就有问题。
问题1:直接赋值和浅拷贝有什么区别?
答:直接赋值的方法,只要是对象,都会相互影响,因为是直接拷贝对象栈里面的地址。
浅拷贝如果是一层对象,不相互影响,如果出现多层对象拷贝还会相互影响。
问题2:浅拷贝怎么理解?
答:拷贝对象之后,里面的属性值是简单数据类型直接拷贝值。
如果属性值是引用数据类型则拷贝的是地址。
二、深拷贝
:拷贝的是对象,不是地址
常见方法:1、通过递归实现深拷贝;2、lodash/cloneDeep;3、通过JSON.stringify()实现
1、递归深拷贝
(简易版)
先理解一下下面这段代码:这个代码只解决了数组的问题,但是没解决对象的问题。