深拷贝的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 } }
相关文章
若依框架 --- echarts 封装
若依框架 --- echarts 封装
765 0
url参数值中有+、空格、%20、%2b
url参数值中有+、空格、%20、%2b
1582 0
|
缓存 JavaScript 算法
vue2和vue3之间diff算法的差异
vue2和vue3之间diff算法的差异
|
JavaScript JSON 前端开发
深/浅拷贝,有哪些实现方式
深/浅拷贝,有哪些实现方式
|
11月前
|
存储 安全 Java
深入理解 Java 中的 instanceof 关键字
本文深入解析了 Java 中的 `instanceof` 关键字,探讨其在类型判断中的作用。作为二元操作符,`instanceof` 可用于检查对象是否为某类实例或实现特定接口,避免类型转换异常 (`ClassCastException`)。文章通过多态性下的类型判断、安全类型转换、接口实现检测及集合元素类型判定等实际应用场景,展示了 `instanceof` 的强大功能。掌握该关键字可提高代码健壮性,确保运行时类型安全。
910 0
|
存储 缓存 负载均衡
什么是CDN(内容分发网络)?
什么是CDN(内容分发网络)?
10075 7
|
JavaScript API
【vue3】写hook这几天,治好了我不会组件封装的弱点。
【vue3】写hook这几天,治好了我不会组件封装的弱点。
vue中组件的局部注册和全局注册
本文介绍了Vue中组件的局部注册和全局注册的方法,并通过示例代码展示了如何在特定组件或整个Vue应用中注册和使用自定义组件。

热门文章

最新文章