手写实现浅拷贝&深拷贝

基于Python适用于YOLO目标检测算法的图片数据增强处理 为了增强模型的鲁棒性以及数据的丰富性,同 时为了防止由于数据过少发生过拟合,本设计对数 据集进行数据增强处理,包括随机亮度调节、随机 对比度调节、随机饱和度调节、加入高斯噪声、水 平翻转、运动模糊和旋转 15° 阅读详情

浅拷贝

  • 新建一个对象,拷贝对象的所有属性值
  • 基本数据就拷贝对应的值,引用数据就拷贝引用数据的引用地址
  • 如果其中一个对象改变了这个地址,就会影响到另一个对象

手写浅拷贝,整体思路如下:

  • 1.拷贝对象是个基本数据,就直接返回该值
  • 2.新建一个对象
  • 3.循环对象的所有属性,并拷贝属性值,如果属性是引用数据就拷贝数据的引用地址
function shallowCopy(obj) {
	// 是基本数据就直接返回
    if (typeof obj !== 'object' || !obj) return obj
    let newObj = Array.isArray(obj) ? [] : {}
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) { //自己本身具有的属性
            newObj[key] = obj[key]
        }
    }
    return newObj
}

深拷贝

  • 创建一个新对象,拷贝对象的所有属性
  • 属性是基本数据就拷贝它的值;是引用数据就重新分配一块内存,拷贝该引用数据的所有属性,把引用地址赋值给对应的属性
  • 引用数据中某个属性也是引用数据,就要继续一层层递归拷贝
  • 简单来说:完整拷贝一份一模一样结构的数据,拷贝后的数据和源数据是没有任何关联的,修改源数据不会修改拷贝后的数据

手写深拷贝,整体思路如下:

  • 1.判断类型,如果是非引用数据类型就直接返回
  • 2.如果是引用类型,创建一个新的对象,遍历需要克隆的对象,将要克隆对象的属性执行深拷贝后依次添加到新对象上
  • 3.解决循环引用问题:额外开辟一个空间来存储当前对象和拷贝对象的对应关系,当需要拷贝当前对象时,先去存储空间找看有没有拷贝过这个对象,有的话就直接返回,没有就继续拷贝
    • 循环引用:对象的属性间接或直接引用了自身
    • 这个存储空间需要存储key-value形式的数据,且key是一个引用类型,可以选择Map
    • 检查map是否克隆过该对象,有则返回,没有就把当前对象作为key,克隆对象作为value进行存储
  • 4.优化一下:将WeakMap替代Map
    • WeakMap的键是弱引用的,其键必须是对象,而值可以是任意的
    • 简单来说,弱引用:一个对象若只被弱引用所引用,则可能在任何时候被回收
    • 当要拷贝的对象非常庞大时,使用Map会对内存造成很大的消耗,Map是强引用,要手动清除Map的属性才能释放这块内存,而WeakMap在下一次垃圾回收机制执行时,这块内存会被释放掉
function deepClone(obj, map = new WeakMap()){
  if(typeof obj !== 'object' || !obj) return  obj
  if(map.get(obj)){
  	return map.get(obj)
  }
  let newObj = Array.isArray(obj) ? [] : {} // 数组 or 对象
  map.set(obj, newObj)
  for(let key in obj){
     newObj[key] = deepClone(obj[key], map) 
  }  
  return newObj
}
Hopf振荡器在机器人步态控制里到底怎么用?一个CPG仿生案例说清楚 本文深入解析了Hopf振荡器在机器人步态控制中的实际应用,通过CPG仿生案例详细展示了从数学方程到关节指令的完整流程。重点探讨了Hopf振荡器的极限环稳定性、参数调节技巧及自适应控制策略,为机器人运动控制提供了高效解决方案。 阅读详情

相关推荐

CyberChef本地搭建

CyberChef本地搭建

2301_80241182的博客 6082

手写实现一个深拷贝

手写实现一个深拷贝属于数据结构的知识点,数据类型包含基本类型和引用类型,基本类型存储在栈中;引用数据类型存储在堆中;基本数据类型没有浅拷贝和深拷贝的区分,浅拷贝和深拷贝的问题存在于引用数据类型中。...

yue200403的博客 3181

告别降级CUDA!手把手教你为RTX 50系显卡(5080/5090)配置专属的PyTorch Nightly + vLLM推理环境

本文详细指导如何为RTX 50系显卡(5080/5090)配置专属的PyTorch Nightly和vLLM推理环境,特别针对CUDA 12.8的适配问题提供解决方案。从硬件准备到源码编译,再到模型部署与性能调优,手把手教你构建高效AI推理系统。

weixin_33724046的博客 409

手写实现深拷贝

原理:toString() 是 Object 的原型方法,调用该方法,可以统一返回格式为 “[object Xxx]” 的字符串,其中 Xxx 就是对象的类型。对于 Object 对象,直接调用 toString() 就能返回 [object Object];而对于其他对象,则需要通过 call 来调用,才能返回正确的类型信息。原理:因为内部机制是通过判断对象的原型链中是不是能找到类型的。

herman_student的博客 1486

WangEditor 5.0版本dangerouslyInsertHtml方法的正确使用方式

WangEditor 5.0版本dangerouslyInsertHtml方法的正确使用方式

yang1067155909的专栏 4291

再生龙(clonezilla)镜像比目标盘大——基于centos8.5

再生龙恢复到小盘遇到的问题及处理,首先是修改分区大小,进入dracut模式后再尝试恢复临时系统。

u010101453的博客 3690

前端手写(三)——手写深拷贝

一、写在前面 深拷贝就是对对象的深度拷贝,假如我们对象中的字段值任然是对象,如果使用浅拷贝,则只能拷贝对象的地址。实现深拷贝存在三种方法: 1、使用JSON.stringify和JSON.parse方法 2、手写一个深拷贝函数。 3、使用第三方库lodash。 下面我们将详细总结一下第一种和第二种。 二、JSON.stringify和JSON.parse方法 const obj = { name: 'Jack', address: { x: 100, y: 200 } } let

weixin_47450807的博客 4734

CloudCompare&PCL 体元累加法(树冠体积计算)

文章目录

dayuhaitang1的博客 1553

JS手写实现深拷贝

原理:利用JSON.stringify 将JavaScript对象序列化成为JSON字符串,并将对象里面的内容转换成字符串,再使用JSON.parse来反序列化,将字符串生成一个新的JavaScript对象。拷贝的对象中如果有 function、undefined、symbol,当使用过JSON.stringify()进行处理之后,都会消失。JSON.parse(JSON.stringify(obj))是比较常用的深拷贝方法之一。实现深拷贝的思路就是,使用for in来遍历传入参数的属性值。

mzp520lf的博客 2005

北斗导航 | 卫星/惯导组合导航方法

从组合导航结构方面来讲,卫星/惯导(下文以GPS/INS)组合模式一般分为三种,即松组合、紧组合和超紧组合(即深组合)。

尘世冰封的专栏 1539

【实战项目开发技术分享】ROS1.0、ROS 2.0和CyberRT开源通信框架对比

随着机器人和自动驾驶技术的飞速发展,开源通信框架在机器人、自动驾驶行业扮演着重要的角色。ROS1.0是一个广泛应用于机器人领域的开源框架,ROS 2.0是其改进版本,而CyberRT是Baidu Apollo自动驾驶平台的通信框架。ROS和ROS 2.0都注重灵活性和共享性,适用于各种机器人应用。CyberRT则专注于实时性和高性能,适用于自动驾驶等对实时性要求较高的场景。选择适合的框架取决于具体应用需求和开发者的偏好。

xiewf的博客 2万+

手写JS—深拷贝

一个引用对象一般来说由两个部分组成:一个具名的Handle,也就是我们所说的声明(如变量)和一个内部(不具名)的对象,也就是具名Handle的内部对象。它在Manged Heap(托管堆)中分配,一般由新增引用对象的New方法是进行创建。深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。比较典型的就是Value(值)对象,如预定义类型Int32,Double,以及结构(struct),枚举(Enum)等。一般简单来说我们都会这么写但是 会有循环引用的问题。

Florenza的博客 2519

第3版•系统集成项目管理工程师(中级) │ 告别迷茫!案例分析高分攻略

🥏第3版•系统集成项目管理工程师(中级) │ 告别迷茫!案例分析高分攻略

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 3870

深拷贝和浅拷贝的区别 & 详解深拷贝的实现方案

深拷贝和浅拷贝其实针对的是引用数据类型 : 浅拷贝就是只拷贝一层, 深拷贝就是层层拷贝。

Luckyfif的博客 2521

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

前端 | 浅拷贝&深拷贝

在前端开发中,我们经常需要复制对象或数组,但不同的复制方式可能会影响数据的完整性和应用的稳定性。本文将深入探讨浅拷贝(Shallow Copy)和深拷贝(Deep Copy)的区别、实现方式及适用场景。

2502_90366796的博客 2282

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++ 浅拷贝 & 深拷贝

C++ 对象的赋值, 赋值, 介绍浅拷贝 (shallow copy) 和深拷贝 (deep copy) 的区别.

我是小白呀的博客 9577

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C++的浅拷贝与深拷贝

C++中有两种拷贝:深拷贝和浅拷贝要是想要运用好拷贝函数就必须清楚深拷贝与浅拷贝的区别深拷贝和浅拷贝的区别是在对象状态中包含其它对象的引用的时候,深拷贝的实现需要构造拷贝函数新建一个堆区空间在进行拷贝,浅拷贝直接拷贝即可(简单的值的拷贝)。

qq_62512411的博客 9410

C#-深拷贝&浅拷贝

关于C#中深拷贝与浅拷贝的理解及使用方法

龟速船长 1049

深入了解:浅拷贝&深拷贝

该文详细解释了浅拷贝&深拷贝 欢迎大家纠正

L2770789195的博客 1767

【C++】深拷贝&浅拷贝

在 C++ 中,当一个对象通过赋值或拷贝即将成为另一个对象的副本时,会发生“浅拷贝”或“深拷贝”。当对象中只包含了基本数据类型成员时,可以使用浅拷贝;当对象中包含了指针类型成员时,需要使用深拷贝。

crr411422的博客 2761

深拷贝&浅拷贝 JS代码实现

JS 深拷贝浅拷贝

yavlgloss的博客 1266

什么是浅拷贝和深拷贝

浅拷贝和深拷贝初学习

林隐的博客 1717

java -- 深拷贝和浅拷贝的区别 & 如何实现深拷贝和浅拷贝

Object类有个clone()的拷贝方法,不过它是protected类型的,我们需要重写它并修改为public类型。除此之外,子类还需要实现Cloneable接口来告诉JVM这个类是可以拷贝的。深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存。使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。让我们修改一下Fruit类,实现Cloneable接口,使其支持深拷贝。

qq_43070052的博客 2377

JavaScript 浅拷贝&深拷贝

浅拷贝&深拷贝

qq_52265298的博客 1363

深拷贝&浅拷贝解析,从原理理解深拷贝

比如例子的object的第一个key为[number],会进行cloneObj[key]的赋值=deepClone(obj[number],cache),其中obj[number]的值为123,!if (cache.get(obj)) return cache.get(obj) // 防止循环引用,程序进入死循环。// 输出:{ a: 1, b: { c: 3 } }//这边定一个obj,来供拷贝。cache.set(obj, cloneObj) // 缓存拷贝的对象,用于处理循环引用的情况。

qq_52368602的博客 611

深拷贝&浅拷贝 & 它们的实现

深拷贝&浅拷贝 浅拷贝 对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得到的数据。 对于数据类型是引用数据类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。实际上两个对象的该成员变量都指向同一个实例。 深拷贝 对于深拷贝来说,不仅要复制对象的所有基本数据类型的成员变量值

qq_44613591的博客 513
上一篇: this指向问题
下一篇: 前端网络相关面试题
ZoeLandia
博客等级 码龄6年 734粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值