js 手写深拷贝方法

文章目录

  • 一、深拷贝实现代码
  • 二、代码讲解
    • 2.1 obj.constructor(obj)
    • 2.2 防止循环引用

手写一个深拷贝是我们常见的面试题,在实现过程中我们需要考虑的类型很多,包括对象、数组、函数、日期等。以下就是深拷贝实现逻辑

一、深拷贝实现代码

const originalObject = {string: 'Hello',number: 42,boolean: true,array: [1, 2, 3],nestedObject: { key: 'value' },date: new Date(),regex: /pattern/g,map: new Map([['key1', 'value1'], ['key2', 'value2']]),set: new Set([1, 2, 3]),func: function (a, b) { return a + b; },symbol: Symbol('symbol')};function deepClone(obj,visited = new WeakMap()){if (visited.has(obj)) {// 防止循环引用return visited.get(obj);}if(typeof obj !== 'object' || obj === null){// 处理基本数据类型和nullreturn obj}if(obj instanceof Date || obj instanceof RegExp || obj instanceof Map || obj instanceof Set){//处理特殊对象return new obj.constructor(obj)}if(Array.isArray(obj) || obj instanceof Object){//处理数组和对象const cloneObj = new obj.constructor();  visited.set(obj, cloneObj);for (let key in obj) {cloneObj[key] = deepClone(obj[key],visited)}return cloneObj}}const clonedObject = deepClone( originalObject); console.log(clonedObject);console.log(originalObject)

二、代码讲解

在这里我讲解代码中我认为比较难懂的点,若大家还有什么其它不懂的地方,欢迎留言评论

2.1 obj.constructor(obj)

obj.constructor(obj) 这种写法通常用于创建一个对象的副本。针对于map,set,date,regex可以再创建一个相同但内存地址不同的的对象

 const originalObject= new Set([1, 2, 3])const cloneObj = new originalObject.constructor(originalObject); cloneObj.add(4)console.log(originalObject);console.log(cloneObj)

在这里插入图片描述

但对于构造函数,对象,会再创建一个相同的对象(地址也相同),所以上面对于数组对象的处理我们并没有传参。

const originalObject= {a:1,b:2
}
const cloneObj = new originalObject.constructor(); 
cloneObj.c= 3
console.log(originalObject);//{a: 1, b: 2, c: 3}
console.log(cloneObj)   //{a: 1, b: 2, c: 3}

2.2 防止循环引用

在上面提供的深拷贝实现中,防止循环引用的处理主要通过使用 WeakMap 实现。WeakMap 是 ECMAScript 6 引入的一种数据结构,它允许将对象作为键存储在 Map 中,但不会阻止这些对象被垃圾回收。这使得 WeakMap 非常适合用于处理循环引用的情况。

  • 创建 visited WeakMap:参数visited = new WeakMap(),用于存储已经访问过的对象
function deepClone(obj, visited = new WeakMap()) {// ...
}
  • 检查是否已访问过:在处理每个对象之前,通过 visited.has(obj) 检查对象是否已经被访问过。
if (visited.has(obj)) {return visited.get(obj);
}
  • 将对象存储到 visited 中:在处理对象时,将其存储到 visited 中,以便后续检查循环引用。
visited.set(obj, cloneObj);

通过上面这样的处理,可以确保在深度拷贝对象的过程中,对于已经访问过的对象,直接返回其拷贝,而不会陷入无限递归的循环引用中

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中re(正则)模块的使用

re 是 Python 标准库中的一个模块,用于支持正则表达式操作。通过 re 模块,可以使用各种正则表达式来搜索、匹配和操作字符串数据。 使用 re 模块可以帮助在处理字符串时进行高效的搜索和替换操作,特别适用于需要处理文本数据的情况。 # 导入…

Shopify如何调取开放接口实现页面更新

Shopify提供了开放接口(API),使开发人员能够通过编程方式与Shopify平台进行交互,并实现页面的更新。通过调用API,您可以获取和更新商店的数据,包括产品、订单、顾客信息等。下面是使用Shopify开放接口实现页…

二分图---染色法(判断二分图),匈牙利算法(二分图的最大匹配) //概念,应用场景,判定证明,算法思路,示例

目录 二分图概念 二分图应用场景 如何判定一个图是否可以划分成二分图 证明 染色法 原理步骤 时间复杂度 算法思路 例子 匈牙利算法 概念 匈牙利使用算法前提,场景 时间复杂度 算法思路 例子 二分图概念 二分图是图论中的一个重要概念,指的是一个图的…

APRISO的低代码能力降低MOM系统全生命周期成本

前言 进入21世纪以来企业之间的竞争发生了巨大的变化,特别是近10年来,客户对产品的需求逐渐多样化,制造企业的生产模式也开始由大批量的刚性生产变为了多品种、小批量的柔性生产模式,生产线也从以前的手工方式转为了以自动化的机…

selenium 爬虫的数据实战

引言 众所周知,Python 有很多的爬虫工具,例如,requests、scrapy、selenium等。但是爬虫有个最难搞的东西就是反爬虫了,使用 requests、scrapy框架爬取速度飞快,但是遇到反爬的网站就得斗智斗勇半天甚至好几天。因此&a…

2024年2月深度学习的论文推荐

我们这篇文章将推荐2月份发布的10篇深度学习的论文 Beyond A*: Better Planning with Transformers via Search Dynamics Bootstrapping. https://arxiv.org/abs/2402.14083 Searchformer是一个基于Transformer架构的人工智能模型,经过训练可以模拟A星寻路算法&a…

【重要公告】BSV区块链协会宣布将启动多项动态安全增强措施

​​发表时间:2024年2月16日 2024年2月16日,瑞士楚格 - BSV区块链协议的管理机构BSV区块链协会(以下简称“BSV协会”)宣布对其运营模式实施全新的安全架构,其中包括引入网络访问规则和数字资产找回协议,以及…

分享一点PDF中获取表格的探索过程

版面分析:如何得到标题、如何的得到段落(正确的段落)、如何得到表格、如何得到图片,图和得到图片上的文字? 还有细节问题:双栏和多栏的问题、公式问题 扫描件:扫描件本质上是图片,如…

Java 网络通信

两台或多台设备通过一定物理设备连接起来构成了网络。 根据网络的覆盖范围不同,对网络分类: 局域网:覆盖范围小,仅仅覆盖一个教室或一个机房。城域网:覆盖范围较大,可以覆盖一个城市。广域网:…

Python轴承故障诊断 (14)高创新故障识别模型

目录 往期精彩内容: 创新点: 前言 1 模型整体结构 1.1 模型整体结构如下所示: 1.2 创新点详细介绍: 2 轴承故障数据的预处理 2.1 导入数据 2.2 故障FFT变换可视化 2.3 故障VMD分解可视化 2.4 故障数据的特征预处理数据集…

基于B/S+MySQL+Tomcat开发的旅游信息管理系统

基于B/SMySQLTomcat开发的旅游信息管理系统 项目介绍💁🏻 塞北村镇旅游网站设计主要用于实现旅游景点信息管理,基本功能包括:主界面模块设计,用户注册模块,旅游景点模块,酒店预订模块&#xff0…

如何利用IP代理高效采集产品数据,打造爆品?

文章目录 一、什么是网络爬虫?二、普通人如何通过网络爬虫赚钱?2.1、心得分享2.2、工具自动化收集信息 三、 动态IP代理3.1、覆盖范围3.2、性价比3.3、教程中心F&Q使用教程 3.4、在网络数据采集中的重要性 四、实战应用案例一:ebay电商【…