JavaScript 手写仿深拷贝
实现对象参数的深拷贝并返回拷贝之后的新对象,因为参数对象和参数对象的每个数据项的数据类型范围仅在数组、普通对象({})、基本数据类型中且无需考虑循环引用问题,所以不需要做过多的数据类型判断,核心步骤有:
- 如果对象参数的数据类型不为“object”或为“null”,则直接返回该参数
- 根据该参数的数据类型是否为数组创建新对象
- 遍历该对象参数,将每一项递归调用该函数本身的返回值赋给新对象
const _sampleDeepClone = target => {if(typeof target === 'object' && target !== null) {const cloneTarget = Array.isArray(target) ? [] : {}for(prop in target) {if(target.hasOwnProperty(prop)) {cloneTarget[prop] = _sampleDeepClone(target[prop])}}return cloneTarget} else {return target}
}
实现对象参数的深拷贝并返回拷贝之后的新对象,因为需要考虑参数对象和参数对象的每个数据项的数据类型可能包括函数、正则、日期、ES6新对象且必须考虑循环引用问题,所以需要引入ES6新对象Map并且详细的判断数据类型,核心步骤有:
- 首先判断对象参数是否为“null”,是则返回“null”
- 判断对象参数数据类型是否为“object”,不是则返回该参数
- 获取到对象参数的构造函数名,判断是否为函数、正则、日期、ES6新对象其中之一,如果是则直接返回通过该参数对象对应的构造函数生成的新实例对象
- 当以上条件判断之后函数依然没有结束时继续进行以下操作
- 在Map对象中获取当前参数对象,如果能获取到,则说明这里为循环引用并返回Map对象中该参数对象的值
- 如果在Map对象中没有获取到对应的值,则保存该参数对象到Map中,作为标记
- 根据该参数的数据类型是否为数组创建新对象
- 遍历该对象参数,将每一项递归调用该函数本身的返回值赋给新对象
const _completeDeepClone = (target, map = new Map()) => {if(target === null) return targetif(typeof target !== 'object') return targetconst constructor = target.constructorif(/^(Function|RegExp|Date|Map|Set)$/i.test(constructor.name)) return new constructor(target)if(map.get(target)) return map.get(target)map.set(target, true)const cloneTarget = Array.isArray(target) ? [] : {}for(prop in target) {if(target.hasOwnProperty(prop)) {cloneTarget[prop] = _completeDeepClone(target[prop], map)}}return cloneTarget
}
相关文章:
JavaScript 手写仿深拷贝
实现对象参数的深拷贝并返回拷贝之后的新对象,因为参数对象和参数对象的每个数据项的数据类型范围仅在数组、普通对象({})、基本数据类型中且无需考虑循环引用问题,所以不需要做过多的数据类型判断,核心步骤有…...
spring低版本设置cookie的samesite属性
场景:比较古老的项目了,ssh架子,Chrome 51 开始,浏览器的 Cookie 新增加了一个SameSite属性,可用于防止 CSRF 攻击和用户追踪。因此需要给其字段赋值。 网上找了很多资源,由于jar版本比较低,没有…...
GPT4o编写步进电机控制代码
我给出的要求如下: 基于STM32F407 HAL库,写一个步进电机控制程序,需要控制8个步进电机,我会给出描述步进电机的结构体变量,基于这些变量需要你做出以下功能,电机脉冲通过定时器中断翻转脉冲引脚的电平实现…...
关于Spring Boot的自动配置
目录 1.EnableAutoConfiguration注解 2.SpringBootConfiguration注解 3.Import注解 4.spring.factories 5.总结 (1)EnableAutoConfiguration (2)AutoConfigurationImportSelector (3) SpringFactoriesLoade…...
## 已解决:`java.sql.SQLSyntaxErrorException: SQL语法错误` 异常的正确解决方法,亲测有效!!! ###
1. 问题描述 java.sql.SQLSyntaxErrorException 是 Java 程序在执行 SQL 查询时,因 SQL 语法错误而抛出的异常。通常情况下,错误信息会指示出错的 SQL 语句及错误原因,如拼写错误、关键字遗漏、字段名称错误等。 典型的错误信息如下&#x…...
备战秋招60天算法挑战,Day22
题目链接: https://leetcode.cn/problems/missing-number/ 视频题解: https://www.bilibili.com/video/BV1HS42197Hc/ LeetCode 268.丢失的数字 题目描述 给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组…...
在Linux下搭建go环境
下载go go官网:All releases - The Go Programming Language 我们可以吧压缩包下载到Windows上再传到Linux上,也可以直接web下载: wget https://golang.google.cn/dl/go1.23.0.linux-amd64.tar.gz 解压 使用命令解压: tar -x…...
738.单调递增的数字
738.单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时,我们称这个整数是单调递增的。 给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。 示例 1: 输入: n 10 输出: 9示例 2: 输入: n 1234 输…...
近年国际重大网络安全事件深度剖析:安全之路任重道远
引言 在当今数字化时代,网络安全已成为全球关注的焦点。随着信息技术的飞速发展,网络攻击的手段和规模也在不断升级,给个人、企业和国家带来了巨大的威胁。本文将盘点近年来国际上发生的重大网络安全事件,分析其影响和教训&#…...
Windows C++控制台菜单库开发与源码展示
Windows C控制台菜单库 声明:演示视频:一、前言二、具体框架三、源码展示console_screen_set.hframeconsole_screen_frame_base.hconsole_screen_frame_char.hconsole_screen_frame_wchar_t.hconsole_screen_frame.h menuconsole_screen_menu_base.hcons…...
ARM——驱动——Linux启动流程和Linux启动
一、flash存储器 lash存储器,全称为Flash EEPROM Memory,又名闪存,是一种长寿命的非易失性存储器。它能够在断电情况下保持所存储的数据信息,因此非常适合用于存储需要持久保存的数据。Flash存储器的数据删除不是以单个的字节为单…...
Docker和虚拟机的区别详细讲解
Docker 和虚拟机(VM)是现代 IT 基础设施中常见的技术,它们都用于在单一硬件上运行多个操作环境,但它们的工作原理、性能、资源利用和使用场景存在显著差异。以下是对 Docker 和虚拟机区别的详细讲解。 一、基础概念 1. Docker …...
leetcode_68. 文本左右对齐
68. 文本左右对齐 题目描述:给定一个单词数组 words 和一个长度 maxWidth ,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词;也就是说,…...
python探索分形和混沌
简单产生复杂,混沌孕育秩序 0. 引言 a. 分形 fractal 【也叫碎形】 分形是一种具有自相似性和复杂结构的几何图形。在分形结构中,无论放大多少次,局部的结构特征都与整体结构相似。这种特性在自然界中广泛存在,比如树木枝干、山…...
LeetCode77 组合
前言 题目: 77. 组合 文档: 代码随想录——组合 编程语言: C 解题状态: 没尝试出来 思路 经典的组合问题,可以考虑使用回溯法。使用回溯法时可以根据回溯法的模板来考虑如何解决。 代码 回溯法 class Solution { p…...
C#:Bitmap类使用方法—第1讲
首先看一下Bitmap定义:封装 GDI 位图,此位图由图形图像及其属性的像素数据组成。 Bitmap 是用于处理由像素数据定义的图像的对象。 下面介绍一下使用的例子: Bitmap image1; private void Button1_Click(System.Object sender, System.Eve…...
PaddleNLP 3.0 支持大语言模型开发
huggingface不支持模型并行。张量并行,不满足大规模预训练的需求。 1、组网部分 2、数据流 3、训练器 4、异步高效的模型存储...
32次8.21(学习playbook-roles,脚本创建数据库和表,mycat读写分离)
1.roles目录介绍 files:⽤来存放由copy模块或script模块调⽤的⽂件。 tasks:⾄少有⼀个main.yml⽂件,定义各tasks。 handlers:有⼀个main.yml⽂件,定义各handlers。 templates:⽤来存放jinjia2模板。 vars:…...
I2C通信协议(软件I2C和硬件I2C)
相比于之前学的异步全双工且需要两条通信线的串口通信,I2C则为同步半双工,仅需要一条通信线,全双工与半双工区别如下: 全双工(Full Duplex)半双工(Half Duplex)数据传输方式同时双向…...
Linux入门——08 进程间通讯——管道
1.进程间通讯 1.1什么是通讯 进程具有独立性(每个进程都有自己的PCB,独立地址空间,页表)但是要进行进程的通信,通信的成本一定不低,打破了独立性 进程间通信目的 数据传输:一个进程需要将它的数据发送给…...
如何快速部署开源捉妖雷达Web版:面向新手的完整实时妖怪追踪指南
如何快速部署开源捉妖雷达Web版:面向新手的完整实时妖怪追踪指南 【免费下载链接】zhuoyao_radar 捉妖雷达 web版 项目地址: https://gitcode.com/gh_mirrors/zh/zhuoyao_radar 捉妖雷达Web版是一款基于现代Web技术开发的实时妖怪追踪工具,专为捉…...
Allegro中Route Keepout、Design Outline和Cutout到底怎么用?一张图讲清PCB布局中的‘禁区’设置
Allegro中三大边界工具实战指南:Route Keepout、Design Outline与Cutout的精准运用 在PCB设计领域,边界定义如同城市规划中的红线,既决定了板卡的物理形态,又影响着电气性能的发挥。Cadence Allegro作为行业标准工具,提…...
Wwise音频处理完整指南:从游戏音效解包到个性化替换的终极方案
Wwise音频处理完整指南:从游戏音效解包到个性化替换的终极方案 【免费下载链接】wwiseutil Tools for unpacking and modifying Wwise SoundBank and File Package files. 项目地址: https://gitcode.com/gh_mirrors/ww/wwiseutil 还在为游戏音频文件无法编辑…...
3步解决AKShare金融数据接口stock_zh_a_spot_em异常:完整数据获取指南
3步解决AKShare金融数据接口stock_zh_a_spot_em异常:完整数据获取指南 【免费下载链接】aktools AKTools is an elegant and simple HTTP API library for AKShare, built for AKSharers! 项目地址: https://gitcode.com/gh_mirrors/ak/aktools AKTools作为一…...
离开Meta后田渊栋官宣创业,估值达46.5亿美元;17个小时谈判破裂,三星电子5万名员工或将罢工;微软纳德拉官宣MDASH框架 | 极客头条
「极客头条」—— 技术人员的新闻圈!CSDN 的读者朋友们好,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。(投稿或寻求报道:zhanghycsdn.net)整理 | 郑丽媛出品 | CSDN(I…...
苹果防线全线血崩,Mythos5天攻破最强硬件,全球20亿台设备危了
太震撼了,苹果花5年数十亿美元造出最强硬件安全防线MIE,三个黑客加一个AI,5天就把它打穿了!20亿台苹果设备的安全逻辑正在被改写,人类安全系统正迎来「奥本海默时刻」 。 就在刚刚,苹果这座「永不陷落的堡…...
LunaTranslator终极指南:如何快速实现视觉小说实时翻译与语言学习
LunaTranslator终极指南:如何快速实现视觉小说实时翻译与语言学习 【免费下载链接】LunaTranslator 视觉小说翻译器 / Visual Novel Translator 项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator LunaTranslator是一款开源的视觉小说翻译工…...
终极指南:调度系统架构设计的核心原理与实践技巧
终极指南:调度系统架构设计的核心原理与实践技巧 【免费下载链接】system-design-101 Explain complex systems using visuals and simple terms. Help you prepare for system design interviews. 项目地址: https://gitcode.com/GitHub_Trending/sy/system-desi…...
TCP专栏-3.三次握手
什么是三次握手三次握手是指,在建立TCP连接时,客户端和服务端总共会发送三个数据包。只有三个数据包都发送成功后,TCP连接才会建立成功。否则,丢失任何一个包,都会导致连接建立失败。发送三个数据包的过程,…...
Parabolic视频下载神器:一站式跨平台解决方案的终极指南
Parabolic视频下载神器:一站式跨平台解决方案的终极指南 【免费下载链接】Parabolic Download web video and audio 项目地址: https://gitcode.com/GitHub_Trending/pa/Parabolic Parabolic是一款基于yt-dlp引擎的专业级视频下载工具,为技术爱好…...
