深拷贝的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 } }
相关文章
|
4月前
|
存储 人工智能 前端开发
深拷贝浅拷贝的区别?如何实现一个深拷贝?
深拷贝浅拷贝的区别?如何实现一个深拷贝?
|
6月前
深拷贝对象数组
深拷贝对象数组
16 0
|
8月前
|
存储 JavaScript 前端开发
深拷贝浅拷贝有什么区别?怎么实现深拷贝?
深拷贝浅拷贝有什么区别?怎么实现深拷贝?
58 0
|
JavaScript 前端开发
数组和对象的浅拷贝,深拷贝
数组和对象的浅拷贝,深拷贝
数组和对象的浅拷贝,深拷贝
|
JSON 数据格式
2、对象拷贝(浅拷贝、深拷贝)、深拷贝的两种方法(递归、转JSON)
2、对象拷贝(浅拷贝、深拷贝)、深拷贝的两种方法(递归、转JSON)
101 0
如何实现Cloneable接口?深拷贝和浅拷贝的区别?
如何实现Cloneable接口?深拷贝和浅拷贝的区别?
如何实现Cloneable接口?深拷贝和浅拷贝的区别?
|
存储 算法 JavaScript
图解对象之:深拷贝与浅拷贝
图解对象之:深拷贝与浅拷贝
106 0
图解对象之:深拷贝与浅拷贝
|
算法 Java
深拷贝一个对象会了,怎么深拷贝一个图?
在前面,我写过一篇Java的深浅拷贝,那是基于对象的拷贝,但放眼数据结构与算法中,你有考虑过怎么拷贝一个图吗?(无向图)
165 0
深拷贝一个对象会了,怎么深拷贝一个图?