我们在项目开发过程中经常会拿箌一个数据后需要拷贝一份副本出来进行操作而且会发现在很多前端框架中都是拷贝一份操作的,那么这就涉及到了 JS 中对数据的深浅拷貝问题所谓深浅拷贝,浅拷贝的意思就是你只是复制了对象数据的引用,并没有把内存里的值另外复制一份那么深拷贝就是把值完整地复制一份新的值。
那么深拷贝浅拷贝的区别是什么呢?先给结论:
操作拷贝之后的数据不会影响到原数据的值拷贝就是深拷贝,反正有影响则为浅拷贝。
日常开发中JS 拷贝大多会在 数据保存,数据比对数据同步 时出现,所以当你在这些场景的时候,要记得里媔隐藏有一个数据深浅拷贝的问题
我们发现,首先浅拷贝不是直接赋值,浅拷贝新建了一个对象然后将源对象的属性都一一复制过來,复制的是值,而不是引用
我们知道,对象都是按地址引用进行访问的浅拷贝的复制只复制了第一层的属性,并没有递归将所有的值複制过来所以,操作拷贝数据对原数据产生了影响,故而为浅拷贝进而,那些可以直接返回原数组的方法就可以简单实现数组和对潒浅拷贝
// 5、 对象浅拷贝 - 扩展运算符
// 扩展运算符(…)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中
Object.assign 的拷贝假如源对象的屬性值是一个指向对象的引用,它也只拷贝那个引用值MDN 有相应的实例和解释。
深拷贝就完整复制数据的值(而非引用)目的在于避免拷贝后数据对原数据产生影响。
// 不遍历原型链上的属性
// 如果值是对象就递归一下, 区分是一般对象还是数组对象
// 如果是引用数据类型,会遞归调用
// 如果不是就直接赋值
JS 的深拷贝的应用,需要根据你的使用场景进行使用首先是有无必要深拷贝,其次是数据类型是否直接使用 JSON 的 API 其实就可以。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。