浅拷贝
-
创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。
-
如果属性是基本类型,拷贝的就是基本类型的值。
-
如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。
-
简单来说可以理解为浅拷贝只解决了第一层的问题,拷贝第一层的基本类型值,以及第一层的引用类型地址。
-
方法:
Object.assign(target, ...sources)
// 其中 target 是目标对象,sources 是源对象,可以有多个,返回修改后的目标对象 target。
深拷贝
- 深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。
- 当对象和它所引用的对象一起拷贝时即发生深拷贝。
- 拷贝前后两个对象(数组)互不影响。
- 深拷贝相比于浅拷贝速度较慢并且花销较大。
- 方法:
JSON.parse(JSON.stringify(object))
-
但是该方法有以下几个问题:
-
会忽略
undefined
-
会忽略
symbol
-
不能序列化函数
-
不能解决循环引用的对象
-
不能正确处理
new Date()
-
不能处理正则
-
总结表格:
—— | 和原数据是否指向同一对象 | 第一层数据为基本数据类型 | 数据中包含子对象 |
---|---|---|---|
赋值 | √ | 改变会使原数据一同改变 | 改变会使原数据一同改变 |
浅拷贝 | × | 改变不会使原数据一同改变 | 改变会使原数据一同改变 |
深拷贝 | × | 改变不会使原数据一同改变 | 改变不会使原数据一同改变 |