深拷贝的3种常用方法

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

深拷贝是一种保持数据独立性和完整性的重要手段,在许多场景下都是不可或缺的操作。 使用深拷贝的原因主要有以下几点:

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

001.png

深拷贝的3种常用方法

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对象。

function jsonDeepCopy(obj) {
   
   
    return JSON.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. 递归函数

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

function deepCopy(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 } }
相关文章
【sgTree】自定义组件:加载el-tree树节点整棵树数据,实现增删改操作。
【sgTree】自定义组件:加载el-tree树节点整棵树数据,实现增删改操作。
PM2 配置文件(ecosystem.config.js 字段详细介绍)
PM2 配置文件(ecosystem.config.js 字段详细介绍)
1069 0
url参数值中有+、空格、%20、%2b
url参数值中有+、空格、%20、%2b
1432 0
|
缓存 JavaScript 算法
vue2和vue3之间diff算法的差异
vue2和vue3之间diff算法的差异
|
JavaScript JSON 前端开发
深/浅拷贝,有哪些实现方式
深/浅拷贝,有哪些实现方式
|
监控 前端开发 测试技术
如何使用 Tree Shaking 进行代码优化
Tree Shaking 是一种通过去除未使用的代码来优化项目打包体积的技术,在现代前端开发中被广泛应用
|
10月前
|
供应链 算法 调度
【双层模型】考虑供需双侧的综合能源双层优化模型
该程序构建了一个综合能源系统的优化调度双层模型,采用差分进化算法和规划算法分别求解上下层问题。模型涵盖了燃气轮机、锅炉、风电、光伏及储能设备的协同运行,并考虑了供应商与用户的利益平衡。通过满足设备出力、储能、负荷平衡等约束条件,实现了系统经济性和性能的优化。程序基于Matlab+Cplex编写,注释详尽且附带文档说明,便于学习研究。
|
存储 缓存 负载均衡
什么是CDN(内容分发网络)?
什么是CDN(内容分发网络)?
8380 7