首页 > 其他分享 >低开开发笔记(五):修bug-深拷贝与浅拷贝

低开开发笔记(五):修bug-深拷贝与浅拷贝

时间:2024-04-26 20:12:43浏览次数:20  
标签:... obj 低开 objClone 对象 key 拷贝 bug

好家伙

 

今天遇到一个bug

 

0.问题描述

描述如下:

 代码如下:

copynodefunc() {
            this.copynode = this.model.selected
        },
        affixnode() {
            const id = this.model.selected.wid - 1;
            const goodnode = this.copynode
            this.dsl.children.splice(id, 0, goodnode);
            this.numberreset();
        },

 

 

1.问题分析

我么的model.selected长这个样子

{
    "wid": 1,
    "component": "ph-radio",
    "props": {
        "No": 1,
        "title": "我是输入框",
        "options_1": "选项一一",
        "options_2": "选项二二"
    },
    "style": {
        "top": "300px",
        "left": "300px",
        "zIndex": "1",
        "border": "1px dashed red"
    },
    "attrs": {},
    "events": {}
}

 

根据我多年开发bug的经验分析,这大概是引用出了问题

在上面的数据中,model.selected中的props是一个对象,估计在拷贝的时候没有进行深拷贝,拷贝的只是对象的引用

 

 

2.修改bug

于是,我们试着

将代码改为

copynodefunc() {
            this.copynode = this.model.selected
        },
        affixnode() {
            const id = this.model.selected.wid - 1;
            const goodnode = {...this.copynode}
            this.dsl.children.splice(id, 0, goodnode);
            this.numberreset();
        },

没什么用

又想到了我们的Object.assign(),但是,没有用,Object.assign()也是浅拷贝

所以,我们自己写一个深拷贝吧

 

 

3.深拷贝代码

export function deepCopy(obj) {
    var objClone ={};
    if (obj && typeof obj === "object") {
        for (var key in obj) {
            if (obj.hasOwnProperty(key)) {
                if (obj[key] && typeof obj[key] === "object") {
                    objClone[key] = deepCopy(obj[key]);
                } else {
                    objClone[key] = obj[key];
                }
            }
        }
    }
    return objClone;
}

代码解释如下:

这段代码定义了一个名为 deepCopy 的函数,用于实现深拷贝(deep copy)操作。深拷贝是指在拷贝对象时,不仅复制对象本身,还会递归复制对象内部的所有子对象,确保原对象和拷贝后的对象完全独立,互不影响。

下面是对代码的详细解释:

  1. export function deepCopy(obj) { ... }:定义了一个导出的函数 deepCopy,该函数接受一个参数 obj,表示需要进行深拷贝的对象。

  2. var objClone = {};:初始化一个空对象 objClone,用于存储深拷贝后的对象。

  3. if (obj && typeof obj === "object") { ... }:首先判断传入的参数 obj 是否存在且为对象类型,确保只对对象进行深拷贝操作。

  4. for (var key in obj) { ... }:使用 for...in 循环遍历对象 obj 的所有可枚举属性,其中 key 为当前属性的键名。

  5. if (obj.hasOwnProperty(key)) { ... }:通过 hasOwnProperty 方法判断当前属性是否为对象自身的属性,而非继承自原型链上的属性。

  6. if (obj[key] && typeof obj[key] === "object") { ... }:若当前属性的值是对象类型,则递归调用 deepCopy 函数进行深拷贝,将结果存储在 objClone[key] 中。

  7. else { objClone[key] = obj[key]; }:若当前属性的值不是对象类型,则直接将其赋给 objClone[key],实现浅拷贝。

  8. return objClone;:返回深拷贝后的对象 objClone

总结:该函数通过递归的方式,对传入的对象进行深拷贝操作,确保拷贝后的对象与原对象完全独立。需要注意的是,该函数仅适用于处理普通对象,对于包含函数、原型链等特殊情况需要进行额外处理。

 

搞定。

 

标签:...,obj,低开,objClone,对象,key,拷贝,bug
From: https://www.cnblogs.com/FatTiger4399/p/18160725

相关文章

  • CS61B Lab2 Debugging
    实验2主要内容教你使用IDE中调试步骤,学会设置断点调试代码学以只用,学会设置断点之后,就开始改代码错误了本节需要学什么?Java配置Configration当你导入一个项目模块时,需要添加修改configration的以下内容。Junit的导入有时候运行的时候会出现“junit不存在等情况”这时......
  • [NewStarCTF]flask disk debug模式下的漏洞
    打开环境,发现三个链接/list/upload/console,题目描述为flask,那就是与flask的debug模式相关的漏洞,在此之前我只听过debug的pin码漏洞,也就是关于pin码的生成的。这里提一下:点击查看代码pin码的生成取决于下面这几个因素:1.服务器运行flask所登录的用户名。2.modname2.geta......
  • ROS2学习--POP方法编写C++节点 debug过程
    一、编写C++节点并测试 1.创建功能包C++功能包使用ament-camke作为编译基础,依赖为rclcpp。打开终端,进入town_ws/src运行下面的指令,目录结构如下ros2pkgcreatevillage_wang--build-typeament_cmake--dependenciesrclcpp2.创建节点village_wang/src下创建一个wang2.cp......
  • Visual Studio 项目发布时将资源目录文件夹所有文件拷贝到发布路径
    1.背景在.NET项目开发过程中,时常需要将资源文件夹复制到生成目录,以确保这些资源随项目输出。2.方法找到当前项目例如:xxxxx.Api 双击进入,对 .csproj文件内容,加入如下信息:<TargetName="CopyResourcesPublish"AfterTargets="Publish"><ItemGroup><Resource......
  • 72.Oradebug用法
    oracle之oradebug命令用法oradebug的前身是在ORACLE7时的ORADBX,它可以启动用停止跟踪任何会话,dumpSGA和其它内存结构,唤醒ORACLE进程,如SMON、PMON进程,也可以通过进程号使进程挂起和恢复等,还有很多功能,实际上这些功能都不常用,但是我们在看别人做问题诊断时,常看到别人在......
  • Java引用拷贝、浅拷贝、深拷贝
    原链接在开发、刷题、面试中,我们可能会遇到将一个对象的属性赋值到另一个对象的情况,这种情况就叫做拷贝。拷贝与Java内存结构息息相关,搞懂Java深浅拷贝是很必要的!在拷贝中这里就分为引用拷贝、浅拷贝、深拷贝进行讲述。引用拷贝引用拷贝会生成一个新的对象引用地址,但是两个最......
  • echarts折线图使用dataZoom,切换数据时渲染异常,出现竖线bug
     今天做项目遇到一个省份过多时,要加滚动条的需求。但是切换数据的时候,出现上图所出现的问题。经查资料,发现可以设置一个属性来解决这个问题。    filterMode:'empty' dataZoom:{     show:this.xiaonengXData.length>12?true:false,//为true滚动条......
  • [Place 30-575]VIVADO 布局布线bug
     开始怀疑是约束文件有问题,把输入引脚的位置错误约束了,但是并没有,DDR的输入时钟也是用的bank33,电平、引脚约束也没错(AlinxAX7325B开发板) 尝试按照建议添加set_propertyCLOCK_DEDICATED_ROUTEBACKBONE,但是imple仍然报该错误,并且综合提示setproperty为空? 原代码中ddr参......
  • Advanced .Net Debugging 1:你必须知道的调试工具
    Advanced.NetDebugging1:你必须知道的调试工具合集-Net高级调试(基于原著)(7) 1.Advanced.NetDebugging1:你必须知道的调试工具01-242.Advanced.NetDebugging2:CLR基础02-273.Advanced.NetDebugging3:基本调试任务(调试目标、符号、控制调试目标执行和设置断点)03-04......
  • js递归实现深拷贝
    functiongetType(data){returnObject.prototype.toString.call(data).replace(']','').substring(8)}function_clone(data,res){consttype=getType(data)if(type==='Object'){Object.keys(data).map(i=>{......