当前位置: 首页 > news >正文

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

优势

  1. 原生支持:不需要第三方库。
  2. 性能优化:相比于 JSON.parse(JSON.stringify) 更快,更安全。
  3. 更多支持的类型:支持 Date、Map、Set、循环引用等复杂结构。
  4. 不受 JSON 限制:能够处理 undefined 和特殊对象。

局限性

  1. 不支持拷贝函数、DOM 节点、自定义类实例。
  2. 需要现代浏览器支持(较老的环境中不可用)。

浏览器兼容性

  • 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++实现

案例需求&#xff1a; 完成数据库插入&#xff0c;删除&#xff0c;修改&#xff0c;查看操作。 分为 插入&#xff0c;删除&#xff0c;修改&#xff0c;查看&#xff0c;查询 几个模块。 代码&#xff1a; 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…...

网络流学习笔记

注&#xff1a;笔者是蒟蒻&#xff0c;所以本文几乎是干货&#xff0c;枯燥无味甚至可能会引人不适&#xff0c;请读者谨慎阅读。 为了笔者快爆掉的肝点个赞好吗&#xff1f;&#xff1f;&#xff1f; 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版本&#xff1a;3.5.7 注意&#xff1a;版本3.1.2及以下是需要return的 因当前为高版本&#xff0c;代码中已将 return 注释。 2、代码 QueryWrapper<Object> queryWrapper new Que…...

Debezium日常分享系列之:Debezium Engine

Debezium日常分享系列之&#xff1a;Debezium Engine 依赖打包项目在代码中输出消息格式消息转换消息转换谓词高级记录使用引擎属性异步引擎属性数据库模式历史属性处理故障 Debezium连接器通常通过部署到Kafka Connect服务来运行&#xff0c;并配置一个或多个连接器来监视上游…...

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简介&#xf…...

【R安装】VSCODE安装及R语言环境配置

目录 VSCODE下载及安装VSCODE上配置R语言环境参考 Visual Studio Code&#xff08;简称“VSCode” &#xff09;是Microsoft在2015年4月30日Build开发者大会上正式宣布一个运行于 Mac OS X、Windows和 Linux 之上的&#xff0c;针对于编写现代Web和云应用的跨平台源代码编辑器&…...

ES更新问题 Failed to close the XContentBuilder异常

问题描述 使用RestHighLevelClient对文档进行局部更新的时候报错如下&#xff1a; Suppressed: java.lang.IllegalStateException: Failed to close the XContentBuilderat org.elasticsearch.common.xcontent.XContentBuilder.close(XContentBuilder.java:1011)at org.elast…...

svn-git下载

windows&#xff1a; svn 客户端&#xff1a;-------------- TortoiseSVN 安装 下载地址&#xff1a;https://tortoisesvn.net/downloads.html, 页面里有语言包补丁的下载链接。 目前最新版为 1.11.0 下载地址&#xff1a; https://osdn.net/projects/tortoisesvn/storage/1.…...

10个Word自动化办公脚本

在日常工作和学习中&#xff0c;我们常常需要处理Word文档&#xff08;.docx&#xff09;。 Python提供了强大的库&#xff0c;如python-docx&#xff0c;使我们能够轻松地进行文档创建、编辑和格式化等操作。本文将分享10个使用Python编写的Word自动化脚本&#xff0c;帮助新…...

Paddle Inference部署推理(十八)

十八&#xff1a;Paddle Inference推理 &#xff08;C&#xff09;API详解 3. 使用 CPU 进行预测 注意&#xff1a; 在 CPU 型号允许的情况下&#xff0c;进行预测库下载或编译试尽量使用带 AVX 和 MKL 的版本 可以尝试使用 Intel 的 MKLDNN 进行 CPU 预测加速&#xff0c;默…...

Redis开发02:redis.windows-service.conf 默认配置文件解析与注解

文件位置&#xff1a;redis安装目录下的 redis.windows-service.conf &#xff0c;存放了redis服务的相关配置&#xff0c;下面列举出默认配置的含义&#xff1a; 配置项含义bind 127.0.0.1限制 Redis 只监听本地回环地址&#xff0c;意味着只能从本地连接 Redis。protected-m…...

redis大key和热key

redis中大key、热key 什么是大key大key可能产生的原因大key可能会造成什么影响如何检测大key如何优化删除大key时可能的问题删除大key的策略 热key热key可能导致的问题解决热key的方法 什么是大key 大key通常是指占用内存空间过大或包含大量元素的键值对。 数据量大&#xff…...

Dubbo 最基础的 RPC 应用(使用 ZooKeeper)

看国内的一些项目时 Dubbo 这个词经常闪现&#xff0c;一直也不以为然&#xff0c;未作搜索&#xff0c;当然也不知道它是做什么用的。直到最近阅读关于大型网站架构相关的书中反复提到 Dubbo 后&#xff0c;觉得不能再对它视而不见。Google 了一下&#xff0c;它是在阿里巴巴创…...

科技赋能:企业如何通过新技术提升竞争力的策略与实践

引言 在当今瞬息万变的商业环境中&#xff0c;科技的迅猛发展正在重新定义行业的游戏规则。无论是小型企业还是跨国巨头&#xff0c;都感受到数字化转型的迫切需求。过去&#xff0c;企业竞争力更多依赖于成本控制、资源调配或市场覆盖&#xff0c;而如今&#xff0c;新技术的引…...

从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.问题描述&#xff1a; 文档哪里能找到所有的权限查看该权限是用户级的还是系统级的。 解决方案&#xff1a; 您好&#xff0c;可以看一下下方链接是否可以解决问题&#xff1a; https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/permissions-for-all-V…...

量子门净化:突破2槽限制的3槽架构实现

1. 量子门净化&#xff1a;从理论到实践的关键突破量子计算领域面临的核心挑战之一是如何在噪声环境下保持量子门操作的精度。传统量子态净化技术虽然能提升静态量子资源的保真度&#xff0c;但对于动态执行的量子算法而言&#xff0c;我们需要更高阶的方法来直接处理操作本身的…...

上午题_结构化开发

耦合基础知识...

Arm生命周期管理器(LCM)架构与安全供应实战解析

1. Arm生命周期管理器(LCM)架构解析生命周期管理器(Lifecycle Manager)是Arm安全架构中的核心安全子系统&#xff0c;负责管理芯片从生产到报废全生命周期的安全状态。我在多个物联网安全芯片项目中验证过&#xff0c;LCM的设计直接影响设备的抗攻击能力和密钥管理可靠性。1.1 …...

为LLM构建持久化知识大脑:基于知识图谱与向量搜索的Memento MCP实战

1. 项目概述&#xff1a;为LLM构建一个持久化、可理解的知识大脑如果你用过Claude Desktop、Cursor或者GitHub Copilot&#xff0c;可能会发现一个痛点&#xff1a;这些AI助手虽然聪明&#xff0c;但它们的“记忆”是短暂的、碎片化的。每次对话都像是一次全新的邂逅&#xff0…...

Universal MCP Toolkit:统一AI工具调用的开源框架实践

1. 项目概述&#xff1a;一个面向AI应用开发的“瑞士军刀”最近在折腾AI应用开发的朋友&#xff0c;可能都遇到过类似的困境&#xff1a;你有一个绝妙的想法&#xff0c;想让你的AI助手&#xff08;比如Claude、GPTs或者自己部署的模型&#xff09;去调用外部的工具&#xff0c…...

dnGrep搜索结果分析与报告生成:如何导出和分享搜索数据

dnGrep搜索结果分析与报告生成&#xff1a;如何导出和分享搜索数据 【免费下载链接】dnGrep Graphical GREP tool for Windows 项目地址: https://gitcode.com/gh_mirrors/dn/dnGrep dnGrep是一款强大的Windows图形化GREP搜索工具&#xff0c;它不仅能够快速搜索文件内容…...

Groundhog:基于Git仓库的开发者时间自动追踪工具

1. 项目概述&#xff1a;一个面向开发者的时间管理利器如果你是一名开发者&#xff0c;或者你的工作与代码、项目、任务紧密相关&#xff0c;那么你一定对“时间都去哪儿了”这个问题深有感触。我们每天在各种编辑器、终端、浏览器标签页之间切换&#xff0c;处理着功能开发、B…...

DRAM控制器优化与内存带宽保障技术解析

1. DRAM控制器架构演进与优化实践现代计算机系统中&#xff0c;DRAM控制器的设计直接影响着内存子系统的整体性能表现。传统控制器采用统一事务队列架构&#xff0c;这种设计虽然实现简单&#xff0c;但在实际应用中暴露出明显的性能瓶颈。让我们深入分析这种架构的局限性及其优…...

AI工具搭建自动化视频生成输出审核

# AI工具搭建视频生成中的数据脱敏&#xff1a;一个Python开发者的实战笔记 做视频自动生成这件事&#xff0c;碰到的第一个坎往往不是技术选型&#xff0c;而是数据安全。特别是当视频里要展示真实用户数据的时候&#xff0c;总不能把用户的姓名、手机号、住址这些敏感信息直接…...

Go语言服务网格egress:外部服务访问

Go语言服务网格egress&#xff1a;外部服务访问 1. Egress代理 package egressimport ("net/http""net/url" )type EgressProxy struct {dialer *net.Dialertransport *http.Transport }func NewEgressProxy() *EgressProxy {return &EgressProxy{d…...