js 深度克隆
深度克隆(Deep Clone)是指复制一个对象或数组及其所有嵌套结构的副本,使得克隆后的对象与原对象完全独立。JavaScript 提供了一些方法实现深度克隆,但每种方法有其优缺点。
1. 常用方法
1.1 使用 JSON.parse 和 JSON.stringify
这种方法最简单,但有局限性。
const obj = { a: 1, b: { c: 2 } };
const clone = JSON.parse(JSON.stringify(obj));console.log(clone); // { a: 1, b: { c: 2 } }
console.log(clone === obj); // false
console.log(clone.b === obj.b); // false
优点
- 简单易用。
- 适用于纯 JSON 格式的数据。
缺点
- 不支持函数、
undefined、Symbol、循环引用等。 - 日期对象会变成字符串,
RegExp对象会丢失。
1.2 使用 structuredClone
structuredClone 是一种内置的深拷贝方法,支持复杂数据结构。
const obj = { a: 1, b: { c: 2 }, d: new Date() };
const clone = structuredClone(obj);console.log(clone); // { a: 1, b: { c: 2 }, d: Date }
console.log(clone === obj); // false
console.log(clone.b === obj.b); // false
优点
- 支持更多类型(如
Date、RegExp、Map、Set等)。 - 处理循环引用。
缺点
- 不支持旧版本浏览器。
1.3 使用递归实现深度克隆
通过递归遍历对象和数组,手动实现深拷贝。
function deepClone(obj) {if (obj === null || typeof obj !== 'object') {return obj;}if (obj instanceof Date) {return new Date(obj);}if (obj instanceof RegExp) {return new RegExp(obj);}const clone = Array.isArray(obj) ? [] : {};for (const key in obj) {if (obj.hasOwnProperty(key)) {clone[key] = deepClone(obj[key]);}}return clone;
}const obj = { a: 1, b: { c: 2 }, d: new Date() };
const clone = deepClone(obj);console.log(clone); // { a: 1, b: { c: 2 }, d: Date }
console.log(clone === obj); // false
console.log(clone.b === obj.b); // false
优点
- 完全控制克隆逻辑。
- 支持特定类型的处理。
缺点
- 不支持循环引用,需额外处理。
2. 循环引用处理
对于有循环引用的对象,需要使用 WeakMap 来避免递归陷入死循环。
function deepClone (value, cache = new WeakMap ()) {if (typeof value !== "object" || value === null) {return value;}if (cache.has(value)) {return cache.get(value);}const result = Array.isArray(value) ? [] : {};Object.setPrototypeOf(result, Object.getPrototypeOf(value));cache.set(value, result);for (i in value) {if (value.hasOwnProperty(i)) {result[i] = deepClone(value[i], cache);}}return result;
}const obj = { a: 1 };
obj.b = obj; // 循环引用let clone = deepClone(obj);
console.log(clone); // { a: 1, b: [Circular] }const Person = function(name, age) {this.name = name;this.age = age;
}Person.prototype.a = 100;clone = new Person('a', 12)console.log(clone);
3. 方法对比
| 方法 | 支持类型 | 处理循环引用 | 性能 | 易用性 |
|---|---|---|---|---|
JSON.parse/stringify | 仅支持 JSON 格式 | 否 | 高 | 简单 |
structuredClone | 支持大部分类型 | 是 | 高 | 简单 |
| 手动递归 | 可定制支持类型 | 否(需扩展) | 中 | 中等 |
| Lodash | 支持复杂结构和循环引用 | 是 | 中 | 简单 |
推荐
- 数据结构简单:使用
JSON.parse和JSON.stringify。 - 现代浏览器:使用
structuredClone。 - 复杂场景:使用
Lodash或手动实现带循环引用处理的深拷贝函数。
相关文章:
js 深度克隆
深度克隆(Deep Clone)是指复制一个对象或数组及其所有嵌套结构的副本,使得克隆后的对象与原对象完全独立。JavaScript 提供了一些方法实现深度克隆,但每种方法有其优缺点。 1. 常用方法 1.1 使用 JSON.parse 和 JSON.stringify …...
深度学习之超分辨率算法——FRCNN
– 对之前SRCNN算法的改进 输出层采用转置卷积层放大尺寸,这样可以直接将低分辨率图片输入模型中,解决了输入尺度问题。改变特征维数,使用更小的卷积核和使用更多的映射层。卷积核更小,加入了更多的激活层。共享其中的映射层&…...
软件测试之压力测试【详解】
压力测试 压力测试是一种软件测试,用于验证软件应用程序的稳定性和可靠性。压力测试的目标是在极其沉重的负载条件下测量软件的健壮性和错误处理能力,并确保软件在危急情况下不会崩溃。它甚至可以测试超出正常工作点的测试,并评估软件在极端…...
电脑出现 0x0000007f 蓝屏问题怎么办,参考以下方法尝试解决
电脑蓝屏是让许多用户头疼的问题,其中出现 “0x0000007f” 错误代码更是较为常见且棘手。了解其背后成因并掌握修复方法,能帮我们快速恢复电脑正常运行。 一、可能的硬件原因 内存问题 内存条长时间使用可能出现物理损坏,如金手指氧化、芯片…...
分布式系统架构:限流设计模式
1.为什么要限流? 任何一个系统的运算、存储、网络资源都不是无限的,当系统资源不足以支撑外部超过预期的突发流量时,就应该要有取舍,建立面对超额流量自我保护的机制,而这个机制就是微服务中常说的“限流” 2.四种限流…...
G口带宽服务器与1G独享带宽服务器:深度剖析其差异
在数据洪流涌动的数字化时代,服务器作为数据处理的核心,其性能表现直接关系到业务的流畅度和用户体验的优劣。随着技术的飞速发展,G口带宽服务器与1G独享带宽服务器已成为众多企业的优选方案。然而,这两者之间究竟有何细微差别&am…...
Flamingo:少样本多模态大模型
Flamingo:少样本多模态大模型 论文大纲理解1. 确认目标2. 分析过程(目标-手段分析)3. 实现步骤4. 效果展示5. 金手指 解法拆解全流程核心模式提问Flamingo为什么选择使用"固定数量的64个视觉tokens"这个特定数字?这个数字的选择背…...
推荐一款免费且好用的 国产 NAS 系统 ——FnOS
一、系统基础信息 开发基础:基于最新的Linux内核(Debian发行版)深度开发,兼容主流x86硬件(ARM还没适配),自由组装NAS,灵活扩展外部存储。 使用情况:官方支持功能较多&am…...
2025系统架构师(一考就过):案例题之一:嵌入式架构、大数据架构、ISA
一、嵌入式系统架构 软件脆弱性是软件中存在的弱点(或缺陷),利用它可以危害系统安全策略,导致信息丢失、系统价值和可用性降低。嵌入式系统软件架构通常采用分层架构,它可以将问题分解为一系列相对独立的子问题,局部化在每一层中…...
开机存活脚本
vim datastadard_alive.sh #!/bin/bashPORT18086 # 替换为你想要检查的端口号 dt$(date %Y-%m-%d)# 使用netstat检查端口是否存在 if netstat -tuln | grep -q ":$PORT"; thenecho "$dt Port $PORT is in use" > /opt/datastadard/logs/alive.log# 如…...
车载网关性能 --- GW ECU报文(message)处理机制的技术解析
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...
CosyVoice安装过程详解
CosyVoice安装过程详解 安装过程参考官方文档 前情提要 环境:Windows子系统WSL下安装的Ubunt22.4python环境管理:MiniConda3git 1. Clone代码 $ git clone --recursive https://github.com/FunAudioLLM/CosyVoice.git # 若是submodule下载失败&…...
传统网络架构与SDN架构对比
传统网络采用分布式控制,每台设备独立控制且管理耗时耗力,扩展困难,按 OSI 模型分层,成本高、业务部署慢、安全性欠佳且开放性不足。而 SDN 架构将控制平面集中到控制器,数据转发由交换机负责,可统一管理提…...
如何打造用户友好的维护页面:6个创意提升WordPress网站体验
在网站运营中,无论是个人博主还是大型企业网站的管理员,难免会遇到需要维护的情况。无论是服务器迁移、插件更新,还是突发的技术故障,都可能导致网站短暂无法访问。这时,设计维护页面能很好的缓解用户的不满࿰…...
【hackmyvm】Zday靶机wp
HMVrbash绕过no_root_squash静态编译fogproject 1. 基本信息^toc 这里写目录标题 1. 基本信息^toc2. 信息收集2.1. 端口扫描2.2. 目录扫描 3. fog project Rce3.1. ssh绕过限制 4. NFS no_root_squash5. bash运行不了怎么办 靶机链接 https://hackmyvm.eu/machines/machine.ph…...
redis使用注意哪些事项
1. 数据类型选择: • Redis支持多种数据类型,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。在选择…...
步进电机位置速度双环控制实现
步进电机位置速度双环控制实现 野火stm32电机教学 提高部分-第11讲 步进电机位置速度双环控制实现(1)_哔哩哔哩_bilibili PID模型 位置环作为外环,速度环作为内环。设定目标位置和实际转轴位置的位置偏差,经过位置PID获得位置期望,然后讲位置期望(位置变化反映了转轴的速…...
优化程序中的数据:从数组到代数
前言 我们往往都希望优化我们的程序,使之达到一个更好的效果,程序优化的一个重点就是速度,加快速度的一个好办法就是使用并行技术,但是,并行时我们要考虑必须串行执行的任务,也就是有依赖关系的任务&#…...
【电商搜索】CRM: 具有可控条件的检索模型
【电商搜索】CRM: 具有可控条件的检索模型 目录 文章目录 【电商搜索】CRM: 具有可控条件的检索模型目录文章信息摘要研究背景问题与挑战如何解决核心创新点算法模型实验效果(包含重要数据与结论)相关工作后续优化方向 后记 https://arxiv.org/pdf/2412.…...
使用 ffmpeg 拼接合并视频文件
按顺序拼接多个视频文件 1、创建文件清单 创建一个文本文件 filelist.txt,列出所有要合并的视频文件。 格式如下: file path/to/video1.mp4 file path/to/video2.mp4 file path/to/video3.mp42、合并文件 下载FFmpeg,然后使用FFmpeg进行…...
XCOM 2模组管理架构优化方案:实现智能冲突检测与高效配置管理
XCOM 2模组管理架构优化方案:实现智能冲突检测与高效配置管理 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mi…...
零基础极速上手:用AI建站工具10分钟生成你的第一个网站
痛点与目标看着别人轻松拥有自己的品牌官网,你是不是也心动了,却因为不懂代码、不会设计、预算有限而迟迟没动手?别担心,搭建专业网站的门槛已经被新一代的AI生成网站工具彻底打破了。即使你完全不懂技术,也能在10分钟…...
Pixel Language Portal 快速配置Ubuntu深度学习环境:CUDA与cuDNN安装指南
Pixel Language Portal 快速配置Ubuntu深度学习环境:CUDA与cuDNN安装指南 1. 前言:为什么需要配置GPU环境 如果你正在使用Pixel Language Portal这类大模型,配置GPU环境是提升性能的关键一步。相比CPU,GPU能提供数十倍的计算加速…...
3步解决网盘下载烦恼:LinkSwift直链助手全解析
3步解决网盘下载烦恼:LinkSwift直链助手全解析 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / …...
网易云音乐NCM格式终极解密指南:ncmdump让加密音乐自由播放
网易云音乐NCM格式终极解密指南:ncmdump让加密音乐自由播放 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经遇到过这样的困扰:从网易云音乐下载的歌曲只能在特定设备上播放,无法在车载音…...
Phi-3 Forest Lab应用场景:技术布道师内容生成器——将复杂概念转化为森林隐喻文案
Phi-3 Forest Lab应用场景:技术布道师内容生成器——将复杂概念转化为森林隐喻文案 1. 项目背景与核心价值 在技术传播领域,如何将复杂的AI概念转化为大众易于理解的内容,一直是技术布道师面临的挑战。Phi-3 Forest Lab通过创新的自然隐喻系…...
霜儿-汉服-造相Z-Turbo开发者案例:基于LoRA的垂直领域文生图轻量化实践
霜儿-汉服-造相Z-Turbo开发者案例:基于LoRA的垂直领域文生图轻量化实践 想亲手打造一个专属于你的古风汉服AI画师吗?今天,我们就来聊聊如何利用“霜儿-汉服-造相Z-Turbo”这个模型,快速搭建一个能生成唯美汉服人像的AI服务。整个…...
IndexTTS-2-LLM环境配置太难?一键镜像免配置部署实战推荐
IndexTTS-2-LLM环境配置太难?一键镜像免配置部署实战推荐 你是不是也对那些复杂的AI环境配置感到头疼?各种Python版本、依赖冲突、CUDA驱动,光是想想就让人望而却步。特别是像IndexTTS-2-LLM这样的语音合成项目,底层依赖复杂&…...
Qwen2-VL-2B-Instruct与Vue3集成指南:构建智能前端应用
Qwen2-VL-2B-Instruct与Vue3集成指南:构建智能前端应用 用最简单的方式,让AI视觉能力为你的Vue应用赋能 1. 开篇:为什么要在Vue里集成视觉AI? 最近一直在折腾各种AI模型,发现Qwen2-VL-2B-Instruct这个多模态模型确实有…...
GLM-. 全面支持与 Gemini CLI 集成:HagiCode 的多模型进化之路佣
1. 流图:数据的河流 如果把传统的堆叠面积图想象成一块块整齐堆叠的积木,那么流图就像一条蜿蜒流淌的河流,河道的宽窄变化自然流畅,波峰波谷过渡平滑。 它特别适合展示多个类别数据随时间的变化趋势,尤其是当你想强调整…...
