structuredClone():JavaScript中深拷贝对象的最简单方法

news2024/11/24 20:38:52

前端岗位内推来了

深拷贝是传递或存储数据时的一项常规编程任务。

  • 浅拷贝:只复制对象的第一层

  • 深拷贝:复制对象的所有层级

const obj = { name: 'Tari', friends: [{ name: 'Messi' }] };

const shallowCopy = { ...obj };

const deepCopy = dCopy(obj);

console.log(obj.friends === shallowCopy.friends); // ❌ true

console.log(obj.friends === deepCopy.friends); // ✅ false

但一直以来,我们都没有一种内置的方法来完美地深度复制对象,这一直是一个痛点。

我们总是不得不依赖第三方库来进行深度复制并保留循环引用。

现在,这一切都因新的structuredClone()而改变了——它是一种简单高效的方法,可以深度复制任何对象。

const obj = { name: 'Tari', friends: [{ name: 'Messi' }] };

const clonedObj = structuredClone(obj);

console.log(obj.name === clonedObj); // false
console.log(obj.friends === clonedObj.friends); // false

轻松克隆循环引用:

const car = {
  make: 'Toyota',
};

// 👆 循环引用
car.basedOn = car;

const cloned = structuredClone(car);

console.log(car.basedOn === cloned.basedOn); // false

// 👇 循环引用被克隆
console.log(car === car.basedOn); // true

这是你永远无法用JSON stringify/parse技巧实现的:

19db94c6ed7ac8746c50d9a6112cd687.png

想深入多少层都可以:

// 👇
const obj = {
  a: {
    b: {
      c: {
        d: {
          e: 'Coding Beauty',
        },
      },
    },
  },
};

const clone = structuredClone(obj);

console.log(clone.a.b.c.d === obj.a.b.c.d); // false
console.log(clone.a.b.c.d.e); // Coding Beauty
你应该知道的限制

structuredClone()非常强大,但它有一些你应该了解的重要弱点:

无法克隆函数或方法

c2855802db4274bc941f2e5145885e13.png

这是因为它使用的特殊算法。

9671f9b0657d6510b09b37f66c1f742e.png

无法克隆DOM元素

<input id="text-field" />
const input = document.getElementById('text-field');

const inputClone = structuredClone(input);

console.log(inputClone);

c93a9d7aaf31e40659cce1aad013b31d.png

不保留RegExplastIndex属性

我是说,没人会去克隆正则表达式,但这是值得注意的一点:

const regex = /beauty/g;
const str = 'Coding Beauty: JS problems are solved at Coding Beauty';

console.log(regex.index);
console.log(regex.lastIndex); // 7

const regexClone = structuredClone(regex);
console.log(regexClone.lastIndex); // 0
其他限制

了解这些限制很重要,以避免使用该函数时出现意外行为。

部分克隆,部分移动

这是一个更复杂的情况。

你将内部对象从源对象转移到克隆对象,而不是复制。

这意味着源对象中没有留下任何可以改变的东西:

const uInt8Array = Uint8Array.from(
    { length: 1024 * 1024 * 16 },
    (v, i) => i
);

const transferred = structuredClone(uInt8Array, {
    transfer: [uInt8Array.buffer],
});

console.log(uInt8Array.byteLength); // 0

总的来说,structuredClone()是JavaScript开发者工具箱中的一个宝贵补充,使对象克隆比以往任何时候都更容易。

最后:

CSS技巧与案例详解

vue2与vue3技巧合集

VueUse源码解读

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

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

相关文章

C++——多态经典案例(二)制作饮品

案例&#xff1a;制作饮品的步骤是差不多一样的&#xff0c;假设都有四步&#xff0c;打开包装Open、煮水Boil、放杯子里面PutInCup、放佐料PutSomething、喝Drink 利用多态&#xff0c;制作茶和咖啡等饮品 分析&#xff1a;定义一个抽象类&#xff0c;纯虚函数包括Open、Boil…

C++(1):构造函数,复制函数和析构函数

引用 ref这里是对i起了一个别名 引用和指针区别区别1.引用直接绑定2.引用必须初始化 auyo a 10;自动匹配a的类型&#xff0c;但是初始化必须给值 内联函数放头文件 不传参形参有默认值 默认形参b有b后面的都必须有默认 函数重载&#xff1a;同名不同参&#xff08;返回值不能作…

浅学 Pytorch

&#xff08;一&#xff09;Dataset Dataset 是一个抽象类&#xff0c;用于表示数据集。它封装了数据的加载和预处理逻辑&#xff0c;使得数据的读取和处理更加灵活和易于管理。在PyTorch中&#xff0c;torch.utils.data.Dataset 是一个基类&#xff0c;用户可以继承并实现自己…

软件渗透测试详细介绍,专业软件测评机构分享

随着信息技术的飞速发展&#xff0c;软件应用已成为我们生活和工作中不可或缺的一部分。然而&#xff0c;与此&#xff0c;信息安全问题也日益凸显&#xff0c;网络攻击的频繁发生让企业和用户面临前所未有的风险。为了更好地保护软件产品的安全性&#xff0c;渗透测试应运而生…

Mysql执行计划(上)

1、执行计划的概念 执行计划是什么&#xff1a;使用EXPLAIN关键字可以模拟优化器执行SQL查询语句&#xff0c;从而知道MySQL是如何处理你的SQL语句的。 作用&#xff1a;分析你的查询语句或是表结构的性能瓶颈 语法&#xff1a;Explain SQL语句 执行计划输出内容介绍&#…

记录一次网关无响应的排查

1. 使用jstack pid > thread.txt 打印进 thread.txt 文件里 去观察线程的状态。 我发现&#xff0c;一个线程在经过 rateliter的prefilter后, 先是调用 consume方法&#xff0c;获取到锁。 接着在执行 jedis的 evalsha命令时 一直卡在socket.read()的状态。 发现jedis官…

【iOS】OC关键字总结及底层原理(上)

目录 线程安全相关的关键字atomic&nonatomic 作用域相关的关键字static、extern、const&auto 读写权限相关和指定方法名的关键字内存管理相关的关键字&#xff08;或方法&#xff09;1. 引用计数的存储SideTableretain方法源码分析release方法源码分析dealloc方法源码分…

无缝融入,即刻智能[4]:MaxKB知识库问答系统[进一步深度开发调试,完成基于API对话,基于ollama大模型本地部署等]

无缝融入,即刻智能[4]:MaxKB知识库问答系统[进一步深度开发调试,完成基于API对话,基于ollama大模型本地部署等] 1.简介 MaxKB(Max Knowledge Base)是一款基于 LLM 大语言模型的开源知识库问答系统, 1.1 产品优势 开箱即用:支持直接上传文档、自动爬取在线文档,支持文本…

计算机网络 6.3Internet组成6.4Internet地址

第三节 Internet组成 一、基本结构及特点 1.Internet结构类型&#xff1a;分层网络互联群体。 2.主要构成&#xff1a;①主干网&#xff1b;②中间层网&#xff1b;③底层网。 3.结构特点&#xff1a; ①对用户隐藏网间连接的底层节点。 ②不指定网络互联的拓扑结构。 ③…

【时时三省】(C语言基础)数组作为函数参数

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ——csdn时时三省 排序为升序-冒泡排序 冒泡排序的思想: 两两相邻的元素进行比较。并且可能得话需要交换 示例: 数组名 数组名是数组首元素的地址 但是有两个例外 1.sizeof(数组名)-数组名表示整个数组-计…

VMware虚拟机上网

一、VMware Network Adapter VMnet8配置 ①打开VMware软件&#xff1a;点击菜单栏→编辑→虚拟网络编辑器 ②点击NAT模式&#xff0c;使用管理员权限对子网IP和网关进行配置 ③子网IP和掩码就是这样&#xff0c;这里可以自行配置 ④点击上图中的NAT设置&#xff0c;配置网关 …

Rider中修改默认文件关联,自定义打开方式

问题描述 想用Qt designer打开.ui文件&#xff0c;但是在Rider中&#xff0c;IDE会默认通过text进行打开 解决方法 1&#xff0c;允许用户将特定的文件类型与一个应用程序关联起来 File -> Settings -> Editor -> File Types -> Recognized File Types下&…

uniapp微信小程序 canvas绘制圆形半透明阴影 createCircularGradient函数不支持透明度部分解决方案

背景 我需要在微信小程序中&#xff0c;用canvas绘制一个圆形钟表&#xff0c;在ui设计图中&#xff0c;有一部分阴影&#xff0c;这里我节选一下&#xff1a; 即深色发黑的部分 canvas通用阴影绘制 由于canvas中并不支持css那样简单的方式为圆形添加阴影或高光&#xff0c…

Spring Boot 默认可以同时处理多少个请求?

微信中阅读&#xff0c;欢迎关注 CodeFit。 创作不易&#xff0c;如果你觉得这篇文章对您有帮助&#xff0c;请不要忘了 点赞、分享 和 关注&#xff0c;为我的 持续创作 提供 动力! 解析 Spring Boot 的请求处理能力 目前&#xff0c;Spring Boot 是 Java 开发中不可或缺的框…

【大模型从入门到精通9】openAI API 提升机器推理:高级策略3

这里写目录标题 理论问题实践问题理论实践实践 理论问题 什么是链式思考推理&#xff08;Chain of Thought Reasoning&#xff09;&#xff0c;它是如何增强人工智能模型在解决问题任务中的表现的&#xff1f; 链式思考推理提供的透明度如何使用户受益并建立对AI模型的信任&am…

基于python和aiohttp实现的web请求管理分发服务

想实现一个web请求管理分发服务&#xff0c;需要有如下功能&#xff1a; 1、第三方服务上报心跳&#xff0c;管理服务能监控第三方服务是否存活 2、管理服务支持http和ws服务的转发 3、管理服务支持最基础的转发策略&#xff0c;比方说轮询 直接上代码 一、网络和路由接口…

用AI助手写程序

用AI帮助写程序究竟靠不靠谱&#xff0c;下面来测试一下&#xff1a; 在文心一言中输入&#xff1a;写一个C Windows API串口通信程序。结果如下&#xff1a; #include <windows.h> #include <iostream> // 串口配置 void ConfigureCommPort(HANDLE hComm) {…

Linux系统的ARM边缘计算网关在纸张处理机械中的应用

数字化时代纸张处理机械行业也在不断追求智能化和高效化。ARM 边缘计算网关作为一种关键技术&#xff0c;为纸张处理机械的智能化提供了强大的支持。结合 Linux 系统的二次开发&#xff0c;它能够加速生产流程&#xff0c;提高生产效率和质量。 ARM 边缘计算网关具有强大的计算…

Python学习笔记50:游戏篇之外星人入侵(十一)

前言 本篇文章接着之前的内容&#xff0c;继续对游戏功能进行优化&#xff0c;主要是优化游戏状态以及对应的处理。 状态 一个游戏包含多种状态&#xff0c;这个状态是一个可以很复杂也可以很简单的内容。条件所限&#xff0c;我们这个游戏的状态就比较简单&#xff1a; 未…

log4j反序列化-流程分析

分析版本 JDK8u141 依赖 <dependencies><!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><ve…