首页 > 其他分享 >深拷贝函数的实现

深拷贝函数的实现

时间:2024-11-11 11:41:50浏览次数:1  
标签:hash 函数 实现 clone obj RegExp Date return 拷贝

function deepClone(obj, hash = new WeakMap()) {
    // 处理 null、undefined、非对象的情况(直接返回值)
    if (obj === null || typeof obj !== 'object') return obj;

    // 防止循环引用
    if (hash.has(obj)) return hash.get(obj);

    // 支持 Date、RegExp 类型
    if (obj instanceof Date) return new Date(obj);
    if (obj instanceof RegExp) return new RegExp(obj);

    // 创建对象或数组的副本
    const clone = Array.isArray(obj) ? [] : {};
    hash.set(obj, clone);

    // 递归拷贝每一个属性
    for (const key in obj) {
        if (obj.hasOwnProperty(key)) {
            clone[key] = deepClone(obj[key], hash);
        }
    }

    return clone;
}

解释

  1. 类型判断:对于 nullundefined 和非对象类型直接返回。
  2. 循环引用:使用 WeakMap 防止循环引用导致的无限递归。
  3. 特殊对象处理DateRegExp 类型分别创建新的实例。
  4. 递归拷贝:对于每个属性,递归调用 deepClone,实现深度复制。

标签:hash,函数,实现,clone,obj,RegExp,Date,return,拷贝
From: https://www.cnblogs.com/94pm/p/18539401

相关文章

  • 实现无感刷新Token技术:.Net Web API与axios的完美结合
    这是我之前分享在星球里面的课程,下面整理下,分享下这个无感刷新Token技术方案。我们都知道Token是有设置有效期的,为了安全都不会设置过长的有效期;但设置有效期太短,又会导致经常需要重新登录。这就需要无感刷新Token的方案,来提升用户体验。目前比较常用的方案是:双token机制。1......
  • SpringBoot线上学习系统的设计与实现kt003 本系统(程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:用户,讲师,学级分类,科目分类,语音课程,视频课程,语音课程购买,视频课程购买,语音课程发送,视频课程发送开题报告内容一、项目背景与意义随着互联网技......
  • vue3+element plus +js 实现树形和末级展开是表格
    1、实现一个树形和末级展开是表格,需要支持大数据量,因此使用VirtualizedTable虚拟化表格 el-table-v22、效果图 3、代码<template><el-table-v2:header-height="0"v-model:expanded-row-keys="expandedRowKeys":columns="columns"......
  • java浅拷贝BeanUtils.copyProperties引发的RPC异常
    作者:京东物流吴义背景近期参与了一个攻坚项目,前期因为其他流程原因,测试时间已经耽搁了好几天了,本以为已经解决了卡点,后续流程应该顺顺利利的,没想到人在地铁上,bug从咚咚来~没有任何修改的服务接口,抛出异常:java.lang.ClassCastException:java.util.HashMapcannotbecastto......
  • SQL练习题之统计连续登录七天的用户(开窗实现)
    4.(困难)统计连续登录七天(含七天)以上的用户(开窗和不开窗都要求实现)。SQL文件:user_sign.sql实现思路:#对日期排序,并用denserank开窗排序#对排序编号或日期的天去重,排除一天登录两次的情况#让日期与排序序号做差,如若连续,则差会相等#分组计数相同的差值#差值相等的大于等于......
  • 【模板】如何实现链表元素的反转
    反转链表是链表操作中一个经典的问题,也是面试中常见的考题。本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作。我们将使用C++代码演示具体实现,同时分析时间复杂度和空间复杂度。问题定义给定一个单链表,我们需要将链表的节点顺序反转。例如,链表1......
  • 10. 基于 Redis 实现消息队列
    消息队列在分布式系统中非常重要,能够有效解耦系统的各个模块,提供异步处理能力和缓冲能力。Redis作为一个高性能的内存数据库,除了缓存和持久化存储,它还能充当轻量级的消息队列。使用Redis处理消息队列有助于提高系统的吞吐量和可扩展性。一、使用场景消息队列的应用场景......
  • 国标GB28181软件LiteGBS国标GB28181网页直播平台,介绍LiteGBS视频安防汇聚平台实现多设
    随着信息化的高速发展,网络已成为人们生活中不可或缺的一部分。视频监控系统也迎来了网络化、智能化的新时代,其发展速度之快,已渗透到人们生活的各个角落。传统的视频监控系统因缺乏智能元素,已无法满足客户对低成本、高扩展性、强兼容性和高性能远程实时视频服务平台的需求。客户期......
  • 模块二:central cache实现
    一、centralcache介绍结构也是一个哈希桶,大小划分和threadcache哈希桶一样,区别在于挂的不是自由链表而是span链表,里面连接了许多span二、span介绍1、实现思路span就是centralcache向pagecache申请的大块内存,由一个个页(大小4KB)组成。span链表是一个带头双向......
  • 大数据项目-基于Django实现的高校图书馆智能推送系统的设计与实现
    《[含文档+PPT+源码等]精品基于Django实现的高校图书馆智能推送系统的设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、包运行成功以及课程答疑与微信售后交流群、送查重系统不限次数免费查重等福利!数据库管理工具:phpstudy/Navicat或者phpstudy/sqlyog......