前端深拷贝非常优质的函数,包含函数、循环引用,Set、Map、Date、自定义构造函数等处理

前端深拷贝

前端深拷贝非常优质的函数,包含函数、循环引用,Set、Map、Date、自定义构造函数等处理

function deepClone(obj: any, hash = new WeakMap()): any {if (Object(obj) !== obj) return obj // 处理基础类型if (hash.has(obj)) return hash.get(obj) // 处理循环引用const result = Array.isArray(obj)? []: obj instanceof Set? new Set(obj): obj instanceof Map? new Map(Array.from(obj, ([key, val]) => [key, deepClone(val, hash)])): obj instanceof Date? new Date(obj.getTime()): obj instanceof RegExp? new RegExp(obj.source, obj.flags): typeof obj === 'function'? obj: obj.constructor? new obj.constructor(): Object.create(null)hash.set(obj, result)return Object.assign(result, ...Object.keys(obj).map((key) => ({ [key]: deepClone(obj[key], hash) })))}

单元测试

it('深拷贝测试', () => {function deepClone(obj: any, hash = new WeakMap()): any {if (Object(obj) !== obj) return obj // 处理基础类型if (hash.has(obj)) return hash.get(obj) // 处理循环引用const result = Array.isArray(obj)? []: obj instanceof Set? new Set(obj): obj instanceof Map? new Map(Array.from(obj, ([key, val]) => [key, deepClone(val, hash)])): obj instanceof Date? new Date(obj.getTime()): obj instanceof RegExp? new RegExp(obj.source, obj.flags): typeof obj === 'function'? obj: obj.constructor? new obj.constructor(): Object.create(null)hash.set(obj, result)return Object.assign(result, ...Object.keys(obj).map((key) => ({ [key]: deepClone(obj[key], hash) })))}const obj = {date: new Date(1716433194530),regex: /test/i,map: new Map([['key', { nested: 'value' }]]),set: new Set([1, 2, 3]),func: function () {console.log('Hello!')},nested: { a: 1, b: [2, 3] },n: null,un: undefined}const clone = deepClone(obj)expect(clone).toEqual(obj)expect(clone).not.toBe(obj)expect(clone.nested).not.toBe(obj.nested)expect(clone.map.get('key')).not.toBe(obj.map.get('key'))expect(clone.date.getTime()).toBe(obj.date.getTime())expect(clone.regex.source).toBe(obj.regex.source)expect(clone.regex.flags).toBe(obj.regex.flags)expect(Array.from(clone.set)).toEqual(Array.from(obj.set))expect(clone.func.toString()).toBe(obj.func.toString())expect(clone.n).toBe(obj.n)expect(clone.un).toBe(obj.un)})

点个收藏点个赞再走呀
点个收藏点个赞再走呀
点个收藏点个赞再走呀
点个收藏点个赞再走呀
点个收藏点个赞再走呀
点个收藏点个赞再走呀
点个收藏点个赞再走呀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python Web实战:Python+Django+MySQL实现基于Web版的增删改查

项目实战 1.创建项目(sms) File->New Project->Django 稍等片刻,项目的目录结构如下图 项目创建后确认是否已安装Django和mysqlclient解释器,如何确认?file->Settings 如果没有请在Terminal终端输入以下命令完成安装 pip instal…

C++初学者指南第一步---5.介绍std::vector

C初学者指南第一步—5.介绍std::vector 目录 C初学者指南第一步---5.介绍std::vector1.初始化/访问2.添加元素3.Resizing调整大小4.在尾部删除元素5. 复制一直是深拷贝! 注意std代表C标准库的命名空间,vector(向量)是标准库中的一…

18V-180V降5V500mA恒压WT5118

18V-180V降5V500mA恒压WT5118 如何实现18V-180V宽电压输入下的恒压5V 500mA输出。输入电压是波动的18V还是高达180V,WT5118都能确保输出端提供稳定的5V电压和500mA的电流。 WT5118 是一款集成了 180V 高电压 MOSFET 的 DC-DC 控制器,专为开关电源设计。该设备具备内…

数字孪生智慧应用场景——数字孪生智慧城市各行业领域应用场景学习参考资料

下面资源来源于网络,如有侵权请联络删除! 数字孪生技术,作为近年来科技领域的热门话题,其发展情况与应用领域正不断拓展深化。简单来说,数字孪生技术是通过构建一个与物理实体相对应的虚拟模型,实现对物理世…

国产化ETL产品必备的特性(非开源包装)

ETL负责将分布的、异构数据源中的数据如关系数据、平面数据文件等抽取到临时中间层后进行抽取、清洗(净化)、转换、装载、标准、集成(汇总)...... 最后加载到数据仓库或数据集市中,成为联机分析处理、数据挖掘的基础。…

代码生成器技术乱弹五十三,人工智能和通用代码生成器的共同点:Token

代码生成器技术乱弹五十三,人工智能和通用代码生成器的共同点:Token 现在,随着人工智能的快速发展,特别是生成式人工智能的爆火,大家逐渐熟悉了一个概念,Token。我称之为字牌。在生成式人工智能的语境下&a…

OpenAI 联合创始人 Ilya Sutskever 的新初创公司致力于“安全超级智能”

OpenAI 前首席科学家伊利亚-苏茨克沃尔(Ilya Sutskever)在今年 5 月离开了他共同创立的人工智能研究公司后,透露了他的下一个重要项目。 相关阅读:GPT-4o通过整合文本、音频和视觉实现人性化的AI交互,OpenAI推出了其新…

大电流与小电流在检测原理上有区别吗

1 常用电流检测原理 1.1 分流器原理 被测量的电流在输入端电阻上Rshunt形成电压正比于测量电流,通过同相比例电路进行放大输出。 缺点: 输入电流减小时,需要更大的Rshunt;输入电阻Rshunt串入检测回路内将引起被测电流减小&a…

山西青年杂志山西青年杂志社山西青年编辑部2024年第10期目录

本刊专稿 共融共创、校企共建BIM创新创业中心的探索与实践 黄强;马福贵;贾晓敏;苏艳贞;魏艳卿; 1-3 财务管理课程专创融合教学改革与实践 宋衍程; 4-7 数字化赋能国际贸易实务课程建设研究 吴珍彩; 8-11《山西青年》投稿:cn7kantougao163.com 青年教育研…

测试时间被压缩的有效应对策略

测试时间被压缩时的有效应对策略 1. 优先级管理2. 使用自动化工具3. 优化测试流程4. 减少测试范围5. 提高测试人员效率6. 快速反馈7. 争取更多有效的资源8. 记录相关风险及建议9. 前期把控10. 测试总结和吸取经验教训 在软件开发中,测试时间的压缩是常见的挑战&…

GD32F303 低功耗模式要点

我们都知道,MCU有低功耗模式,比如GD32F303芯片,就有Sleep、Deepsleep和Standby三种模式。关于这三种模式的具体使用方法,小伙伴们可以参考《GD32F30x系列用户手册》。 今天我们来聊下几个低功耗模式要点。 1、进入低功耗模式后I…

若依RuoYi-Vue分离版—多环境配置

若依RuoYi-Vue分离版—多环境配置 方式一:需要新建application-{profile}.yml文件方式二:不需要新建文件,使用文档分隔符 (不推荐)总结 若依支持通过简单的配置,切换不同的环境, 如开发环境&…

perfect-scrollbar缩小浏览器窗口滚动条无线滚动的bug

https://github.com/mdbootstrap/perfect-scrollbar/issues/153

Sa-token基本使用教程(全网最详细!!!)

1.概述 1.1 Sa-Token介绍 功能简单示例 1.2 Sa-Token 功能一览 2. 使用 2.1 导入依赖 2.2 springBoot的简单集成 2.2.1 配置文件 2.2.2 controller 2.2.3 简单登录页面 2.3 功能详解 2.3.1 登录认证 2.3.1.1 登录与注销 NotLoginException 登录分析 先校验账号和…

Python3,10行代码,从数据库获取各个维度的数据统计,并把结果输出在Excel中。

10行代码自动统计数据 1、引言2、代码实例3、总结 1、引言 小屌丝:鱼哥帮个忙 小鱼:稍等会哦, 小屌丝:好嘞。 小屌丝: 鱼哥, 还没忙完嘛? 小鱼:快了快了, 再耐心等一等…

【JVM】详解Java 堆内存分区

Java 堆内存(Heap Memory)是 Java 虚拟机(JVM)中用于存储对象实例的区域。为了更有效地管理和回收内存,Java 堆通常被划分为不同的区域,每个区域有特定的用途和特点。以下是 Java 堆内存分区的定义、作用以…

P2433【深基1-2】小学数学 N 合一

1. 题目链接 https://www.luogu.com.cn/problem/P3954 【深基1-2】小学数学 N 合一 2. 题目描述 问题1:输出I love Luogu! 问题2:10个苹果,A拿走2个,U拿走4个,B拿走剩下的,求A和U一共拿走几个&#xff0c…

Springboot拓展之整合邮件 JavaMail的使用与实操

邮件 电子邮件仍然是我们企业间交往的一种非常常见的方式 发送简单邮件 第一步首先导入坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><version>2.6.13</version&…

win11家庭版使用自带的Linux子系统并安装docker【全网整合版】

1. 电脑配置项 开发者选项 设置->系统->开发者选项 启用或关闭windows功能 控制面板->卸载程序->启用或关闭windows功能 勾选适用于Linux的Windows子系统和虚拟机平台并重启电脑(首次勾选选项时电脑提示重启) Hyper-V 关键点&#xff1a;win11家庭版在启动…

不知道怎么下载原版系统,这几个原版系统下载网站可以帮你

电脑是我们日常办公生活中必备不可少的设备&#xff0c;无论是个人使用还是企业部署&#xff0c;拥有一个稳定、安全且纯净的操作系统对于保障数据安全和提升使用体验至关重要。然而&#xff0c;网络上充斥着各种二次打包的系统版本&#xff0c;这些版本往往携带了第三方软件或…