0


深拷贝:概念、使用原因、应用场景、3种常用方法

在这里插入图片描述

关于作者:

还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,echarts等技术开发,欢迎加底部微信(gis-dajianshi),一起交流。

在这里插入图片描述
热门专栏精彩推荐图文案例Openlayers综合(300+) Cesium (200+) Leaflet (150+) MapboxGL (150+)Canvas (100+) Echarts (100+)Openlayers基础(70+)Geoserver服务 网络配置HTML 杂货铺javascript 精选 CSS布局动画Vue概念详解vue2 实战 vue3 实战
在这里插入图片描述

文章目录

什么是深拷贝?

深拷贝(Deep Copy)是指在计算机程序设计中,复制一个对象时不仅复制其基本类型值,而且也复制其引用类型的属性所指向的对象,并同样递归地复制这些对象的所有属性,直到所有的可到达对象都是独立的副本。这样,修改新副本中的任何内容都不会影响原对象及其任何其他副本。

在这里插入图片描述

为什么要使用深拷贝?

**

深拷贝是一种保持数据独立性和完整性的重要手段,在许多场景下都是不可或缺的操作。

** 使用深拷贝的原因主要有以下几点:

  • **独立性**:深拷贝创建的是一个完全独立的副本,对副本的操作不会影响原始数据,这在一些场景中非常重要,比如数据备份、多线程编程等。
  • **安全性**:通过深拷贝,可以避免意外修改原始数据,从而提高代码的安全性和稳定性。
  • **可复用性**:深拷贝后的副本可以独立使用和修改,方便代码的复用和模块化开发。
  • **隔离性**:在一些复杂的数据结构中,深拷贝可以确保不同部分的数据相互隔离,避免不必要的关联和影响。
  • **性能优化**:对于一些需要频繁修改数据的场景,使用深拷贝可以避免不必要的共享和同步操作,提高程序的性能。

深拷贝的应用场景

  • 数据备份和恢复:在进行数据备份时,使用深拷贝可以创建数据的完整副本,以便在需要时进行恢复。
  • 多线程编程:在多线程环境下,深拷贝可以避免多个线程同时修改同一个对象导致的竞态条件。
  • 对象复制和克隆:当需要创建一个对象的副本时,深拷贝可以确保副本与原始对象完全独立,不会相互影响。
  • 数据传递和共享:将数据通过深拷贝传递给其他模块或进程,可以确保数据的独立性和完整性。
  • 测试和模拟:在测试代码中,深拷贝可以用于创建测试数据的副本,以便进行各种测试和模拟。
  • 缓存和数据持久化:深拷贝可以用于缓存数据或将数据持久化到存储介质中,以提高性能和数据的可用性。

这些只是深拷贝的一些常见应用场景 ,**

实际上,只要需要创建独立、不受原始对象影响的副本,都可以考虑使用深拷贝。

**

在这里插入图片描述

实现深拷贝的常用方法

1. 使用Lodash库的_.cloneDeep()方法

import _ from'lodash';let original ={a:1,b:{c:2}};let copied = _.cloneDeep(original);
copied.b.c =3;
console.log(original);// { a: 1, b: { c: 2 } }
console.log(copied);// { a: 1, b: { c: 3 } }

2. JSON.parse + JSON.stringify

使用 **

JSON.stringify

** 将对象转换成JSON字符串,再使用 **

JSON.parse

** 将其解析为新的JavaScript对象。

functionjsonDeepCopy(obj){returnJSON.parse(JSON.stringify(obj));}// 示例let original ={a:1,b:{c:2}};let copied =jsonDeepCopy(original);
copied.b.c =3;
console.log(original);// { a: 1, b: { c: 2 } }
console.log(copied);// { a: 1, b: { c: 3 } }

**

注意

**:这种方法存在局限性,例如它不能处理函数、日期、循环引用等特殊对象。

3. 递归函数

通过递归的方式遍历对象或数组的所有层级,逐个创建新的对象和数组。

functiondeepCopy(obj){if(obj ===null||typeof obj !=='object'){// 如果不是对象或数组,则直接返回原值return obj;}let copy = Array.isArray(obj)?[]:{};// 判断是否为数组并初始化新对象for(let key in obj){if(obj.hasOwnProperty(key)){
            copy[key]=deepCopy(obj[key]);// 递归调用自身复制子对象}}return copy;}// 示例let original ={a:1,b:{c:2}};let copied =deepCopy(original);
copied.b.c =3;// 修改拷贝后的对象不会影响原始对象
console.log(original);// { a: 1, b: { c: 2 } }
console.log(copied);// { a: 1, b: { c: 3 } }

本文转载自: https://blog.csdn.net/cuclife/article/details/136453132
版权归原作者 还是大剑师兰特 所有, 如有侵权,请联系我们删除。

“深拷贝:概念、使用原因、应用场景、3种常用方法”的评论:

还没有评论