JavaScript原生深拷贝方法 structuredClone使用
structuredClone 简介
structuredClone 是现代浏览器提供的原生 JavaScript 方法,用于深拷贝对象。它可以处理各种复杂数据结构,包括嵌套对象、数组、Date、Map、Set 等,且支持循环引用。
语法
const clone = structuredClone(value);
value: 需要深拷贝的值,可以是任何支持的 JavaScript数据结构。- 返回值是完全独立的深拷贝对象。
支持的类型
structuredClone 支持多种类型,包括:
- 基本数据类型:
string,number,boolean,null,undefined,Symbol - 复杂对象:
Object,Array,Date,Map,Set,ArrayBuffer,TypedArray - 循环引用: 能正确处理循环引用的结构。
示例
基本对象深拷贝
const obj = { a: 1, b: { c: 2 } };
const deepCopy = structuredClone(obj);deepCopy.b.c = 42;
console.log(obj.b.c); // 输出 2,原对象未受影响
处理数组
const arr = [1, [2, 3], 4];
const deepCopy = structuredClone(arr);deepCopy[1][0] = 42;
console.log(arr[1][0]); // 输出 2,原数组未受影响
支持循环引用
const obj = { a: 1 };
obj.self = obj; // 创建循环引用const deepCopy = structuredClone(obj);
console.log(deepCopy.self === deepCopy); // 输出 true,循环引用也被正确复制
拷贝特殊对象
const special = {date: new Date(),map: new Map([['key', 'value']]),set: new Set([1, 2, 3])
};const deepCopy = structuredClone(special);console.log(deepCopy.date === special.date); // 输出 false,完全独立
console.log(deepCopy.map.get('key')); // 输出 'value'
console.log(deepCopy.set.has(1)); // 输出 true
无法拷贝的类型
以下类型的值不支持 structuredClone,会抛出异常:
- 函数 (
Function) - DOM 节点
- 类实例(例如自定义类对象)
const fn = { a: () => {} };
structuredClone(fn); // 抛出异常:Uncaught DOMException
优势
- 原生支持:不需要第三方库。
- 性能优化:相比于
JSON.parse(JSON.stringify)更快,更安全。 - 更多支持的类型:支持 Date、Map、Set、循环引用等复杂结构。
- 不受 JSON 限制:能够处理
undefined和特殊对象。
局限性
- 不支持拷贝函数、DOM 节点、自定义类实例。
- 需要现代浏览器支持(较老的环境中不可用)。
浏览器兼容性
structuredClone是现代浏览器(如 Chrome 98+、Edge 98+、Firefox 94+)中才支持的 API。- 如果需要在不支持
structuredClone的环境中使用,可以考虑手动实现深拷贝或使用第三方库(如 Lodash 的cloneDeep)。
总结
structuredClone 是深拷贝对象和数据结构的最佳原生解决方案之一。对于现代开发者来说,它是一个便捷且性能优越的工具,尤其是在处理复杂对象和循环引用时。
相关文章:
JavaScript原生深拷贝方法 structuredClone使用
structuredClone 简介 structuredClone 是现代浏览器提供的原生 JavaScript 方法,用于深拷贝对象。它可以处理各种复杂数据结构,包括嵌套对象、数组、Date、Map、Set 等,且支持循环引用。 语法 const clone structuredClone(value);value:…...
SpringBoot无法使用jkd8问题
1. 解决SpringBoot无法使用jdk8问题 创建一个高 jkd 版本,如 jkd21 在创建项目后,将 pom.xml中的 jdk 版本改为8,找到下图所在位置修改即可。 此外将 SpringBoot 的版本修改为 2 开头的 如2.7.4 ,然后 刷新 Maven 项目即可。 在 …...
使用 Jina Embeddings v2 在 Elasticsearch 中进行后期分块
作者:来自 Elastic Gustavo Llermaly 在 Elasticsearch 中使用 Jina Embeddings v2 模型并探索长上下文嵌入模型的优缺点。 在本文中,我们将配置和使用 jina-embeddings-v2,这是第一个开源 8K 上下文长度嵌入模型,首先使用 semant…...
QT简易项目 数据库可视化界面 数据库编程SQLITE QT5.12.3环境 C++实现
案例需求: 完成数据库插入,删除,修改,查看操作。 分为 插入,删除,修改,查看,查询 几个模块。 代码: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget…...
python json.dump()和json.dumps()的区别
用人话总结一下 json.dump()是针对文件的json和python的转换 json.dumps()主要是针对内容数据 json.dumps(obj, skipkeysFalse, ensure_asciiTrue, check_circularTrue, allow_nanTrue, clsNone, indentNone, separatorsNone, encoding“utf-8”, defaultNone, sort_keysFalse…...
网络流学习笔记
注:笔者是蒟蒻,所以本文几乎是干货,枯燥无味甚至可能会引人不适,请读者谨慎阅读。 为了笔者快爆掉的肝点个赞好吗??? Part.1 网络流基础定义 一个有向带权图 G ( V , E ) G(V,E) G(V,E) 是…...
Mybatis PLUS查询对List使用OR模糊查询
Mybatis PLUS查询对List使用OR模糊查询 1、版本2、代码3、效果 1、版本 Mybatis PLUS版本:3.5.7 注意:版本3.1.2及以下是需要return的 因当前为高版本,代码中已将 return 注释。 2、代码 QueryWrapper<Object> queryWrapper new Que…...
Debezium日常分享系列之:Debezium Engine
Debezium日常分享系列之:Debezium Engine 依赖打包项目在代码中输出消息格式消息转换消息转换谓词高级记录使用引擎属性异步引擎属性数据库模式历史属性处理故障 Debezium连接器通常通过部署到Kafka Connect服务来运行,并配置一个或多个连接器来监视上游…...
I.MX6U 裸机开发20. DDR3 内存知识
I.MX6U 裸机开发20. DDR3 内存知识 一、DDR3内存简介1. DDR发展历程SRAMSDRAMDDR1DDR2DDR3DDR4DDR5 2. 开发板资源3. DDR3的时间参数1. 传输速率2. tRCD3. CL 参数作用取值范围工作原理4. tRC参数原理单位与取值5. tRAS重要性及作用 二、I.MX6U MMDC 控制器1. MMDC简介…...
【R安装】VSCODE安装及R语言环境配置
目录 VSCODE下载及安装VSCODE上配置R语言环境参考 Visual Studio Code(简称“VSCode” )是Microsoft在2015年4月30日Build开发者大会上正式宣布一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代Web和云应用的跨平台源代码编辑器&…...
ES更新问题 Failed to close the XContentBuilder异常
问题描述 使用RestHighLevelClient对文档进行局部更新的时候报错如下: Suppressed: java.lang.IllegalStateException: Failed to close the XContentBuilderat org.elasticsearch.common.xcontent.XContentBuilder.close(XContentBuilder.java:1011)at org.elast…...
svn-git下载
windows: svn 客户端:-------------- TortoiseSVN 安装 下载地址:https://tortoisesvn.net/downloads.html, 页面里有语言包补丁的下载链接。 目前最新版为 1.11.0 下载地址: https://osdn.net/projects/tortoisesvn/storage/1.…...
10个Word自动化办公脚本
在日常工作和学习中,我们常常需要处理Word文档(.docx)。 Python提供了强大的库,如python-docx,使我们能够轻松地进行文档创建、编辑和格式化等操作。本文将分享10个使用Python编写的Word自动化脚本,帮助新…...
Paddle Inference部署推理(十八)
十八:Paddle Inference推理 (C)API详解 3. 使用 CPU 进行预测 注意: 在 CPU 型号允许的情况下,进行预测库下载或编译试尽量使用带 AVX 和 MKL 的版本 可以尝试使用 Intel 的 MKLDNN 进行 CPU 预测加速,默…...
Redis开发02:redis.windows-service.conf 默认配置文件解析与注解
文件位置:redis安装目录下的 redis.windows-service.conf ,存放了redis服务的相关配置,下面列举出默认配置的含义: 配置项含义bind 127.0.0.1限制 Redis 只监听本地回环地址,意味着只能从本地连接 Redis。protected-m…...
redis大key和热key
redis中大key、热key 什么是大key大key可能产生的原因大key可能会造成什么影响如何检测大key如何优化删除大key时可能的问题删除大key的策略 热key热key可能导致的问题解决热key的方法 什么是大key 大key通常是指占用内存空间过大或包含大量元素的键值对。 数据量大ÿ…...
Dubbo 最基础的 RPC 应用(使用 ZooKeeper)
看国内的一些项目时 Dubbo 这个词经常闪现,一直也不以为然,未作搜索,当然也不知道它是做什么用的。直到最近阅读关于大型网站架构相关的书中反复提到 Dubbo 后,觉得不能再对它视而不见。Google 了一下,它是在阿里巴巴创…...
科技赋能:企业如何通过新技术提升竞争力的策略与实践
引言 在当今瞬息万变的商业环境中,科技的迅猛发展正在重新定义行业的游戏规则。无论是小型企业还是跨国巨头,都感受到数字化转型的迫切需求。过去,企业竞争力更多依赖于成本控制、资源调配或市场覆盖,而如今,新技术的引…...
从0开始深度学习(33)——循环神经网络的简洁实现
本章使用Pytorch的API实现RNN上的语言模型训练 0 导入库 import torch import torch.nn as nn import torch.nn.functional as F from torch.utils.data import Dataset, DataLoader from collections import Counter import re import math from tqdm import tqdm1 准备数据 …...
【FAQ】HarmonyOS SDK 闭源开放能力 — 公共模块
1.问题描述: 文档哪里能找到所有的权限查看该权限是用户级的还是系统级的。 解决方案: 您好,可以看一下下方链接是否可以解决问题: https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/permissions-for-all-V…...
OpenClaw安全防护方案:nanobot镜像的4种权限控制方法
OpenClaw安全防护方案:nanobot镜像的4种权限控制方法 1. 为什么需要关注OpenClaw的安全防护? 去年夏天,我在调试一个自动整理照片的OpenClaw任务时,不小心让AI删除了整个相册目录——仅仅因为我忘记限制文件删除权限。这次惨痛教…...
3个高效技巧:深度解析ComfyUI节点管理的实战指南
3个高效技巧:深度解析ComfyUI节点管理的实战指南 【免费下载链接】ComfyUI-Easy-Use In order to make it easier to use the ComfyUI, I have made some optimizations and integrations to some commonly used nodes. 项目地址: https://gitcode.com/gh_mirrors…...
Python张量框架选型不是技术问题,而是组织问题:CTO必须在立项前确认的5个战略问题(含人才储备周期、长期维护成本、专利风险审计清单)
第一章:Python张量框架选型不是技术问题,而是组织问题当团队在 PyTorch、TensorFlow 和 JAX 之间反复争论“哪个性能更好”或“哪个 API 更优雅”时,往往已陷入技术决定论的误区。真正制约张量框架落地效果的,是组织内部的协同惯性…...
Windows平台Docker部署Home Assistant全攻略:从零配置到智能家居控制
1. 环境准备与Docker安装 想在Windows上玩转智能家居中枢?DockerHome Assistant组合绝对是新手友好方案。我去年给父母家改造智能家居时就用的这套方案,实测稳定运行一年多没出过问题。先说说基础环境搭建,这里会手把手带你避开我踩过的坑。 …...
Arduino控制步进电机全攻略:从脉冲计算到加速曲线优化
Arduino控制步进电机全攻略:从脉冲计算到加速曲线优化 引言:为什么需要精准控制步进电机? 在创客和嵌入式开发领域,步进电机因其精准的开环控制特性而广受欢迎。不同于普通直流电机,步进电机能够通过精确控制脉冲数量来…...
vLLM推理服务搭建指南:从环境配置到模型上线,一步不漏
vLLM推理服务搭建指南:从环境配置到模型上线,一步不漏 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库,以其出色的吞吐量和易用性在AI社区广受欢迎。这个最初由加州大学伯克利分校开发的框架,如今已…...
JSONModel终极指南:iOS开发者的自动数据映射神器
JSONModel终极指南:iOS开发者的自动数据映射神器 【免费下载链接】jsonmodel 项目地址: https://gitcode.com/gh_mirrors/jso/jsonmodel JSONModel是一个强大的iOS数据建模框架,能够快速创建智能数据模型并自动映射JSON数据。作为iOS开发者的终极…...
实战:在无商店的Win10企业版ThinkPad上,通过PowerShell手动部署Lenovo Vantage
1. 为什么需要手动部署Lenovo Vantage 很多ThinkPad用户可能都遇到过这样的困扰:新装的Windows 10企业版系统找不到微软应用商店,而Lenovo Vantage这个必备的管理工具又只能通过商店安装。作为一个长期使用ThinkPad的技术博主,我完全理解这种…...
计算机毕设微信小程序入门实战:从零搭建到避坑指南
最近在帮学弟学妹看计算机毕设,发现很多同学第一次做微信小程序,很容易踩坑。要么是代码写得像“意大利面条”,逻辑混在一起;要么是功能做完了,结果卡在微信审核上,反复被拒。今天我就结合自己的经验&#…...
C++ Move 构造函数底层执行机制
C Move构造函数底层执行机制探秘 在C11引入的移动语义中,Move构造函数通过高效转移资源所有权优化性能,成为现代C的核心特性之一。理解其底层机制不仅能提升代码效率,还能避免资源管理中的常见陷阱。本文将深入剖析Move构造函数的实现原理&a…...
