当前位置: 首页 > news >正文

算法练习--深拷贝与浅拷贝

🎀个人主页:努力学习前端知识的小羊
感谢你们的支持:收藏🎄 点赞🍬 加关注🪐

文章目录

    • 算法地址
    • 算法题解
    • 分析深拷贝与浅拷贝

在练习算法时,遇到了深拷贝与浅拷贝的问题,于是就了解了一番

算法地址

浅拷贝
深拷贝

算法题解

浅拷贝

const _shallowClone = target => {// 补全代码let copyRes=Array.isArray(target)?[]:{}for(let key in target){copyRes[key]=target[key]}return copyRes
}

深拷贝

 const _completeDeepClone = (target, map = new Map()) => {  // 补全代码if(target === null) return targetif(typeof target !== 'object') return targetconst constructor = target.constructorif(/^(Function|RegExp|Date|Map|Set)$/i.test(constructor.name)) return new constructor(target)   //进行深拷贝,不能传递地址if(map.get(target)) return map.get(target)  //已经遍历到了,直接返回结果map.set(target, true)   //还未遍历,设置为trueconst cloneTarget = Array.isArray(target) ? [] : {}for(prop in target) {       //开始遍历if(target.hasOwnProperty(prop)) {cloneTarget[prop] = _completeDeepClone(target[prop], map)}}return cloneTarget}

分析深拷贝与浅拷贝

浅拷贝

浅拷贝:自己创建一个新的对象,来接受你要重新复制或引用的对象值。如果对象属性是基本的数据类型,复制的就是基本类型的值给新对象;但如果属性是引用数据类型,复制的就是内存中的地址,如果其中一个对象改变了这个内存中的地址,肯定会影响到另一个对象。

实现浅拷贝,可以直接通过Object.assign方法实现

const obj = {};
const source = {name: 'nordon',info: {age: 18}
};Object.assign(obj, source);

注:该方法的第一个参数是拷贝的目标对象,后面的参数是拷贝的来源对象(也可以是多个来源)。

实现浅拷贝,也可以通过扩展运算符来实现

const source = {name: 'nordon',info: {age: 18}
};
const obj = {...source};

深拷贝

深拷贝作用在引用类型上!例如:Object,Array
深拷贝不会拷贝引用类型的引用,而是将引用类型的值全部拷贝一份,形成一个新的引用类型,这样就不会发生引用错乱的问题,使得我们可以多次使用同样的数据,而不用担心数据之间会起冲突。

实现深拷贝,可以通过for in 实现


function deepCopy1(obj) {let o = {}for(let key in obj) {o[key] = obj[key]}return o
}let obj = {a:1,b: undefined,c:function() {},deepCopy1(obj)

实现深拷贝还可以通过递归实现

function deepClone1(obj) {//判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝var objClone = Array.isArray(obj) ? [] : {};//进行深拷贝的不能为空,并且是对象或者是if (obj && typeof obj === "object") {for (key in obj) {if (obj.hasOwnProperty(key)) {if (obj[key] && typeof obj[key] === "object") {objClone[key] = deepClone1(obj[key]);} else {objClone[key] = obj[key];}}}}return objClone;
}

希望对朋友们有所帮助,如有更好的见解,欢迎评论留言哦,期待你们的支持✨✨✨

http://www.lryc.cn/news/21618.html

相关文章:

  • Wireshark “偷窥”浏览器与服务器三次握手
  • 基于stm32温湿度采集平台开发
  • 单机模拟kafka分布式集群(演示生产、消费数据过程)
  • 办公室人员离岗识别检测系统 yolov7
  • Android从屏幕刷新到View的绘制(一)之 Window、WindowManager和WindowManagerService之间的关系
  • #多源数据融合#:HSI与Lidar
  • android 权限控制与进程隔离
  • 链表(一):移除链表元素、设计链表等力扣经典链表题目
  • 计算机网络 第4章 作业1
  • Redis-Java代码使用示例
  • acwing3485最大异或和(trie树,贪心)
  • EasyRecovery16免费的电脑的数据恢复工具
  • 银行数字化转型导师坚鹏:平安银行数字化转型—橙E网战略研究
  • tun驱动之open
  • 计算机网络体系结构
  • 基础夯实,字节内部总结240道算法LeetCode刷题笔记,直呼太全
  • Three.js使用WebWorker进行八叉树碰撞检测
  • 【教程】Notion笔记多平台设置中文显示
  • [牛客Hot101]链表篇
  • Vue3 核心模块源码解析(上)
  • 【C进阶】指针的高级话题
  • 无源晶振匹配电容—计算方法
  • 【测试】自动化测试03(JUnit)
  • 《计算机视觉和图像处理简介 - 中英双语版》:神经网络中的激活函数 ReLU vs Sigmoid
  • (三十七)大白话SQL标准中对事务的4个隔离级别,都是如何规定的呢?
  • 全国计算机等级考试三级网络技术考试大纲(2022年版)
  • 服务器部署—若依【vue】如何部署到nginx里面?nginx刷新页面404怎么办?【完美解决建议收藏】
  • 算法练习(特辑)算法常用的数据结构、集合和方法总结
  • Apk转Aab(Android-App-Bundle)
  • 大学物理期末大题专题训练总结-热学大题