javascript 深拷贝总结

embedded/2024/9/22 14:37:30/

JavaScript 中的深拷贝是创建一个与原始对象完全独立的新对象,新对象中的属性值是原始对象属性值的一个拷贝,而不是引用。这意味着,如果你修改新对象,原始对象不会受到影响,反之亦然。

以下是一些实现深拷贝的常见方法:

1. JSON 方法

使用 JSON.stringify() 和 JSON.parse() 可以实现深拷贝,但这种方法有一些限制:
    * 它不能复制函数和循环引用的对象。
    * 它不能复制 Date 对象、RegExp 对象等特殊对象,因为 JSON.stringify() 会将它们转换为字符串。
    * 它可能会丢失对象的某些属性,如 `undefined`、`Symbol` 类型的属性和函数的 `prototype` 属性。
function deepCopy(obj) {
    return JSON.parse(JSON.stringify(obj));
}
2. 手动递归复制

通过递归遍历对象的所有属性,并逐个复制,可以实现深拷贝。这种方法可以处理函数和特殊对象,但需要更多的代码。
function deepCopy(obj, hash = new WeakMap()) {
    if (typeof obj !== 'object' || obj === null) {
        return obj;
    }

    // 如果已经是循环引用,则直接返回引用
    if (hash.has(obj)) {
        return hash.get(obj);
    }

    let newObj = Array.isArray(obj) ? [] : {};
    hash.set(obj, newObj);

    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            newObj[key] = deepCopy(obj[key], hash);
        }
    }

    return newObj;
}
这个 deepCopy 函数使用了 WeakMap 来跟踪已经访问过的对象,从而避免无限循环。对于每个对象,如果它已经被访问过,就直接返回它的引用;否则,创建一个新的对象,并递归地复制它的所有属性。

3. 使用第三方库

如 lodash 的 _.cloneDeep() 方法也可以实现深拷贝。
const _ = require('lodash');

let obj = { a: 1, b: { c: 3 } };
let newObj = _.cloneDeep(obj);

总的来说,选择哪种深拷贝方法取决于你的具体需求。如果你的对象结构相对简单,没有循环引用或特殊对象,那么 JSON.stringify() 和 JSON.parse() 可能是一个简单而有效的选择。然而,如果你的对象结构更复杂,包含循环引用或特殊对象,那么你可能需要手动实现深拷贝或使用第三方库。


http://www.ppmy.cn/embedded/9797.html

相关文章

RTT设备驱动框架学习(UART)

在serial.h中 struct rt_serial_device {struct rt_device parent;const struct rt_uart_ops *ops;struct serial_configure config;void *serial_rx;void *serial_tx;struct rt_spinlock spinlock;struct rt_device_notify rx_notify; } typedef struct rt_serial_device rt_…

mysql基础14——视图

视图 视图是一种虚拟表 可以把一段查询语句作为视图存储在数据库中 需要的时候把视图看作一个表,对里面的数据进行查询 视图并没有真正存储数据 避免了数据存储过程中可能产生的冗余 提高了存储的效率 子查询 嵌套在另一个查询中的查询 派生表 如果在查询中…

279. 完全平方数

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。 …

工业互联网集成应用实训室解决方案

一、背景 工业互联网集成应用实训室是专门为提供工业互联网技术实践教学和培训的设施,旨在帮助学生学习和掌握工业互联网技术。工业互联网是“互联网各个传统行业”的典型应用,通过利用互联网平台和信息通信技术,实现互联网与其他传统行业的…

风力发电自动化控制系统中的智能化技术应用研究

风力发电自动化控制系统中的智能化技术应用研究 随碳中和目标的提出和执行,风能发电作为新能源行业的核心部分,步入了它的黄金发展期。由于风能资源具有间歇性、随机性等特点,这给风电的高效利用带来了巨大挑战。为了增强风力发电系统的工作效…

计算机网络【CN】Ch3 数据链路层

目录 数据链路层的功能 【※】VLAN 三种划分VLAN的方法: 【※】MAC帧格式 【※】三种可靠传输机制 ​编辑 【※】介质访问控制 信道划分介质访问控制 随机介质访问控制 CSMA CSMA/CD【有线】 CSMA/CA【无线】 信道利用率技巧 循环冗余校验CRC 以太网[802.3] 以太网…

javaWeb项目-网吧网咖管理系统功能介绍

项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog 1、JAVA简介 JavaSc…

cuda算子模板移植到自研芯片

在将CUDA算子模板移植到自研芯片的过程中,可能涉及以下几个关键步骤和相应的工具/技术: 源代码解析与分析: 工具:源代码解析器、静态代码分析工具(如Clang Static Analyzer、LLVM前端等)作用:解析CUDA C/C++源代码,识别出算子的具体实现逻辑、数据访问模式、并行化策略…