好家伙

 

今天遇到一个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

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

搞定。

低开开发笔记(五):修bug-深拷贝与浅拷贝的更多相关文章

  1. Django开发笔记五

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.页面继承 定义base.html: <!DOC ...

  2. 【python测试开发栈】—理解python深拷贝与浅拷贝的区别

    内存的浅拷贝和深拷贝是面试时经常被问到的问题,如果不能理解其本质原理,有可能会答非所问,给面试官留下不好的印象.另外,理解浅拷贝和深拷贝的原理,还可以帮助我们理解Python内存机制.这篇文章将会通过 ...

  3. 流畅的python学习笔记第八章:深拷贝,浅拷贝,可变参数

    首先来看赋值,浅拷贝,深拷贝. 一赋值: a=['word',2,3] b=a print id(a),id(b) print [id(x) for x in a] print [id(x) for ...

  4. Django开发笔记六

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.登录功能完善 登录成功应该是重定向到首页,而不是转发 ...

  5. Django开发笔记四

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.邮箱激活 users app下,models.py: ...

  6. Django开发笔记三

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.基于类的方式重写登录:views.py: from ...

  7. Django开发笔记二

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.xadmin添加主题.修改标题页脚和收起左侧菜单 # ...

  8. Django开发笔记一

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.运行 python manage.py runser ...

  9. 《MFC游戏开发》笔记五 定时器和简单动画

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9332377 作者:七十一雾央 新浪微博:http:// ...

  10. Java开发笔记(六十五)集合:HashSet和TreeSet

    对于相同类型的一组数据,虽然Java已经提供了数组加以表达,但是数组的结构实在太简单了,第一它无法直接添加新元素,第二它只能按照线性排列,故而数组用于基本的操作倒还凑合,若要用于复杂的处理就无法胜任了 ...

随机推荐

  1. WPF 模仿微信顶部断网提示气泡

    直接看顶部气泡的效果吧 顶部气泡主要要做三个工作 1.定位到顶部居中 2.气泡需要跟随窗体 3.气泡不可以遮挡住其他程序界面 原生的WPF Poupu控件不会跟随目标移动且在Z轴上会置顶,所以存在打开 ...

  2. Orleans - 1 .NET生态构建分布式系统的利器

    在当今数字化时代,构建高效.可靠的分布式系统是许多企业和开发团队面临的挑战.微软的 Orleans 框架为解决这些挑战提供了一个强大而简单的解决方案.本文将介绍 Orleans 的核心概念,并通过一个 ...

  3. Prompt工程全攻略:15+Prompt框架一网打尽(BROKE、COAST、LangGPT)、学会提示词让大模型更高效

    Prompt工程全攻略:15+Prompt框架一网打尽(BROKE.COAST.LangGPT).学会提示词让大模型更高效 0.相关文章推荐 更多Prompt框架技术细节和原理见相关文章 Prompt ...

  4. KingbaseES 等待事件之 - Client ClientWrite

    等待事件含义 Client:ClientWrite等待事件指数据库等待向客户端写入数据. 在正式业务系统中,客户端必然和数据库集群之间有数据交互,这里指的是数据接收,发送.数据库集群在向客户端发送更多 ...

  5. 如何使用Java代码混淆技术保护您的应用程序

    摘要 本文探讨了代码混淆在保护Java代码安全性和知识产权方面的重要意义.通过混淆技术,可以有效防止代码被反编译.逆向工程或恶意篡改,提高代码的安全性.常见的Java代码混淆工具如IPAGuard.A ...

  6. C++原子操作与内存序 1

    问题 #include<iostream> #include<thread> int main() { int sum = 0; auto f = [&sum]() { ...

  7. Java实现软件设计模式---抽象工厂模式(性别产品等级结构肤色产品族)

    一.题目要求 二.画出对应的类图 三.文件目录结构 四.具体实现代码 Black.java 1 package com.a004; 2 3 public class Black implements ...

  8. #dfs,trie#洛谷 4341 [BJWC2010]外星联络

    题目 分析 首先时间复杂度\(O(n^2)\)可过,统计子串个数可以用trie或者更高级的方法 可以枚举所有的后缀,然后建一个trie,这样这个trie就可以记录全部的子串 关于字典序排序,深搜的时候 ...

  9. Git入门指南:从新手到高手的完全指南

    Git是一种强大的分布式版本控制系统,广泛应用于软件开发中.它的使用不仅可以帮助开发团队更好地管理代码,还可以提高团队协作效率和代码质量.随着软件开发的不断发展,版本控制成为了程序员必备的一项技能.G ...

  10. eclipse 卡顿的优化办法

    1. 关闭校验 2. 关闭插件自动升级 3.关闭界面设置的一些选项