这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战
深拷贝和浅拷贝的定义
拷贝和赋值的区别:
一、赋值(Copy)
赋值是将某一数值或对象赋给某个变量的过程,分为:
1、基本数据类型:赋值,赋值之后两个变量互不影响。
2、引用数据类型:赋址,两个变量具有相同的引用,指向同一个对象,相互之间有影响。
二、浅拷贝(Shallow Copy)
1、什么是浅拷贝
创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果这个对象中的属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。
上图中,源对象包含基本类型属性 field1 和引用类型属性 refObj。浅拷贝之后基本类型数据 field2 和 filed1 是不同属性,互不影响。但引用类型 refObj 仍然是同一个,改变之后会对源对象产生影响。
2.浅拷贝使用场景
2.1 Object.assign()
Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
2.2 展开操作符 ...
2.3 Array.prototype.slice方法
slice不会改变原数组,slice() 方法返回一个新的数组对象,这一对象是一个由 begin和 end(不包括end)决定的原数组的浅拷贝。
三、深拷贝(Deep Copy)
1、 什么是深拷贝?
源对象包含基本类型属性 field1 和引用类型属性 refObj1。浅拷贝之后基本类型数据 field2 和 filed1 是不同属性,互不影响。引用类型 refObj1 和 refObj2 是不同属性,互不影响。深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。
四、总结
| 和原数据是否指向同一对象 | 第一层数据为基本数据类型 | 原数据中包含子对象 | |
|---|---|---|---|
| 赋值 | 是 | 改变会使原数据一起改变 | 改变会使原数据一起改变 |
| 浅拷贝 | 否 | 改变不会使原数据一起改变 | 改变会使原数据一起改变 |
| 深拷贝 | 否 | 改变不会使原数据一起改变 | 改变不会使原数据一起改变 |
2 使用深拷贝的场景
2.1 JSON.parse(JSON.stringify(object))
对数组深拷贝之后,改变原数组不会影响到拷贝之后的数组。
但是该方法有以下几个问题:
(1)会忽略 undefined
(2)会忽略 symbol
(3)不能序列化函数
(4)不能解决循环引用的对象
(5)不能正确处理new Date()
(6)不能处理正则
其中(1)(2)(3) undefined、symbol 和函数这三种情况,会直接忽略。(4)循环引用会报错,(5)* new Date 情况下,转换结果不正确解决方法:转成字符串或者时间戳就好了。
手写深拷贝
参考:
1.赋值和拷贝www.cnblogs.com/chengxs/p/1…
2.手写深拷贝juejin.cn/post/684490…