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

[前端]深浅拷贝

一、回顾变量类型

基础类型

boolean(bool)

number

string

null

undefined

引用类型

object

​ function

​ array

基本类型与引用类型的存储

基本类型一般存储在 栈 (栈小) 

  1. 栈一旦确认 大小就固定 可能会造成溢出
  2. 栈一般是先进后出
  3. 用于存储基础类型以及引用类型的堆地址
  4. 运行速度快

引用类型一般存储在 堆(堆大)

  1. 堆大小不确认 可以扩展
  2. 不允许js直接操作堆数据
  3. 无序存储
  4. 由于其大小不固定 顺序不固定 导致 速度慢

堆栈示意图

栈内容当程序运行完毕 栈就空了

但是堆内容不见的一定就空 可能会出现 没有任何指针指向堆内容 导致都变成垃圾

所以我们需要手动指向 null让其销毁

二、深浅拷贝

深浅拷贝分两种情况 引用类型 基础类型

基础类型都是深拷贝

引用类型 大多数是浅拷贝 也可以变成深拷贝

深拷贝 地址不同 一个改变另一个并不跟随发生变化就是深拷贝 拷贝内容 地址不同

浅拷贝 地址相同 一个改变另一个随之改变 就是浅拷贝 拷贝的是地址

 
  1. 深拷贝
  2. let a = 10;
  3. let b = a;
  4. console.log(1,a,b,a===b);
  5. a = 88;
  6. console.log(2,a,b,a===b);
  7. console.log("======================");
  8. 浅拷贝
  9. let obj1 = {
  10. n : 88
  11. }
  12. let obj2 = obj1;
  13. console.log(1,obj1,obj2,obj1===obj2);
  14. obj1.a = 99;
  15. console.log(2,obj1,obj2,obj1===obj2);
 
  1. 实现深拷贝 array object
  2. 1.JSON.stringify JSON.parse
  3. let obj1 = {
  4. n : 88
  5. }
  6. let obj2 = JSON.parse(JSON.stringify(obj1)); //深拷贝
  7. console.log(1,obj1,obj2,obj1===obj2);
  8. obj1.a = 99;
  9. console.log(2,obj1,obj2,obj1===obj2);
  10. 2. ... 解构
  11. let arr1 = [1,5,6,7];
  12. let arr2 = [...arr1];
  13. console.log(1,arr1,arr2,arr1===arr2);
  14. arr1[0] = "222"
  15. console.log(2,arr1,arr2,arr1===arr2);
 
  1. // 伪拷贝 一般情况下是 第一层深拷贝 后面层浅拷贝
  2. let arr1 = [1,2,3,[6,7,8]];
  3. let arr2 = arr1.slice();
  4. console.log(1,arr1,arr2,arr1 === arr2);
  5. arr1[0] = 180;
  6. arr1[3][0] = 666;
  7. console.log(2,arr1,arr2,arr1 === arr2);
  8. let arr1 = [1,2,3,[6,7,8]];
  9. let arr2 = arr1.concat();
  10. console.log(1,arr1,arr2,arr1 === arr2);
  11. arr1[0] = 180;
  12. arr1[3][0] = 666;
  13. console.log(2,arr1,arr2,arr1 === arr2);
 
  1. let menu1 = {
  2. menu: "菜单",
  3. item:{
  4. type: "menu",
  5. name: "子菜单"
  6. }
  7. }
  8. // Object.assign(目标,源)
  9. let menu2 = Object.assign({},menu1)
  10. console.log(1,menu1,menu2,menu1 === menu2);
  11. menu1.menu = "编辑"
  12. menu1.item.name = "保存"
  13. console.log(2,menu1,menu2,menu1 === menu2);

想要解决真正意义上的拷贝咋办

扁平化 嵌套的多层想办法给他变成地扁平化 递归思想

递归思想

普通的 按正常处理

深度的(引用类型 )按递归处理 直到没有引用类型为止··

 
  1. let woniu = {
  2. name: "张三",
  3. age: 8,
  4. school: [
  5. {
  6. id: 1,
  7. name: "清华校区"
  8. },
  9. {
  10. id: 2,
  11. name: "北大校区"
  12. },
  13. {
  14. id: 3,
  15. name: "上交校区"
  16. },
  17. {
  18. id: 4,
  19. name: "国科大校区"
  20. }
  21. ],
  22. subject: {
  23. web: "web前端",
  24. java: "java后端",
  25. python: "python",
  26. ui: "设计"
  27. }
  28. }
  29. function copyData(source) {
  30. // 定义一个容器 容器需要根据源来决定 源是对象 你就是你对象 源是数组你就是数组
  31. let result = Array.isArray(source) ? [] : {};
  32. for (const item in source) { // 遍历源 对象与数组的统一遍历方式是 for in
  33. if (typeof source[item] === "object") { //区分引用类型与普通类性别 引用类型继续处理(遍历)基本类型直接返回
  34. result[item] = copyData(source[item])
  35. } else {
  36. result[item] = source[item];
  37. }
  38. }
  39. return result; // 最终将结果返回
  40. }
  41. let fanyun = copyData(woniu);
  42. console.log(1,woniu,fanyun);
  43. woniu.subject.web = "web大前端"
  44. woniu.school[0].name = "总校区"
  45. console.log(2,woniu,fanyun);

 

相关文章:

[前端]深浅拷贝

一、回顾变量类型 基础类型 boolean(bool) number string null undefined 引用类型 object ​ function ​ array 基本类型与引用类型的存储 基本类型一般存储在 栈 (栈小) 栈一旦确认 大小就固定 可能会造成溢出栈一般是先进后出用于存储…...

文章纠错免费软件-文字校对软件免费下载

自动校对稿件的软件 自动校对稿件的软件是一种基于自然语言处理(Natural Language Processing, NLP)和机器学习(Machine Learning)技术的工具,可以较为准确地检测和纠正文本中出现的语法、拼写、标点符号以及其他笔误…...

【Redis】Redis缓存雪崩、缓存穿透、缓存击穿(热key问题)

目录 一、缓存穿透 1、概念 2、解决办法 1.缓存空对象 2.布隆过滤 二、缓存雪崩 1、概念 2、解决办法 1.给key设置随机的过期时间TTL 2.业务添加多级缓存 3.利用集群提供服务可用性 4.缓存业务添加降级限流 三、缓存击穿 1、概念 2、解决办法 1.互斥锁 2.逻辑…...

为什么很多程序员喜欢linux系统?

a> Linux哪些行业在运用? Linux系统运用极其广泛,不少用户只知道windows,是因为,Linux的运用主要是在企业端。现在科技极其发达,我们手机在手,就能干很多事情,只需点一点屏幕,轻松…...

Bean 作用域和生命周期

✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录 lombok的使用案例引入作用域定义singleton单例作用域prototype原型作用域(多例作用域)request请求作用域session会话作用域ap…...

PMP考试常见13个固定套路

一、变更批准之后 变更批准后要做三件事: 1、在变更日志中记录 2、通知相关干系人 3、更新项目管理计划 二、风险的情景题 1、先判断风险识别了,还是风险发生了。 2、若是风险识别,按风险管理程序走; 3、若是风险发生,则应采取应急措施…...

Leecode101 ——对称二叉树

对称二叉树:Leecode 101 leecode 101 对称二叉树 根据题目描述,首先想清楚,对称二叉树要比较的是哪两个节点。对于二叉树是否对称,要比较的是根节点的左子树与根节点的右子树是不是相互翻转的,其实也就是比较两个树,…...

JVM学习随笔03——Java堆中new一个对象的步骤

目录 一、进行类加载 二、堆中分配内存 1、怎么输出GC日志: 2、内存分配的两种方式: 3、内存分配过程中并发控制的两种方式: 三、内存空间初始化 四、对象头初始化(对象头包含哪些信息?) 五、执行构…...

虹科方案 | CEMEX 使用HK-Edgility 智能边缘计算平台简化其企业 WAN 管理和运营

一、应对价值 130 亿美元的跨国企业的网络挑战 “我们选择 Edgility 是因为其卓越的管理和协调功能,它为我们提供了一个端到端的工具集,可以经济高效地部署和管理我们边缘设备的生命周期。” —— Fernando Garcia -Villaraco Casero, CEMEX 全球IT 战略…...

rk3568 系统移植和编译

1。 硬件问题 尽量根据原版 evb 开发版 pcb 进行布线和移植,切记不可自行走线。 emmc 和 ddr4 选型都有要求的,按照硬件手册进行设计 2。软件问题 2.1 目前固件系统选用1.3.2 版本进行设计 解压后运行 .repo/repo/repo sync -c 更新代码 2.2 ubo…...

深度解析C++异常处理机制:分类、处理方式、常见错误及11新增功能

C 基础知识 八 异常处理 上篇 一、基础1. 异常的概念2. 异常的分类2.1 内置异常2.2 自定义异常 3. 异常的处理方式3.1 try-catch 语句3.2 throw 语句3.3 noexcept 修饰符3.4 finally 语句块 二、 异常处理机制1 try-catch 语句块2 异常处理流程3 标准异常类 三、 抛出异常1 thr…...

FPGA时序约束(四)主时钟、虚拟时钟和时钟特性的约束

系列文章目录 FPGA时序约束(一)基本概念入门及简单语法 FPGA时序约束(二)利用Quartus18对Altera进行时序约束 FPGA时序约束(三)时序约束基本路径的深入分析 文章目录 系列文章目录前言主时钟约束跨时钟域…...

JNI开发

文件结构(选中的为生成的) CMake构建不需要执行命令,会自动生成so文件打包进apk Android mk构建需要执行命令生成so文件,再打包进apk。命令如下。 # 在jni目录下执行 # 生成com_demo_cppproject_OtherNdkTest.h头文件 javac -h .…...

JAVA有哪些特点?

JAVA有以下特点: 综上所述,Java作为一种先进的面向对象编程语言,具有简单、可移植、健壮、高性能、多线程、动态性、跨平台、开放性和安全性等众多特点,已经成为广泛使用的编程语言之一。 简单易学:JAVA语言的语法与C语…...

使用读写锁提高并发

我们想要的是:允许多个线程同时读,但只要有一个线程在写,其他线程就必须等待。 ReadWriteLock ReadWriteLock的作用: 只允许一个线程写入(其他线程既不能写入也不能读取);没有写入时&#xf…...

使用@PropertySource加载配置文件

1.PropertySource和PropertySources注解 1.1.PropertySource注解概述 PropertySource注解是Spring 3.1开始引入的配置类注解。通过**PropertySource注解可以将properties配置文件中的key/value存储到Spring的Environment中,Environment接口提供了方法去读取配置文…...

事务及分布式事务解决方案

基础概念 1.1.事务 事务可以看做是一次大的活动,它由不同的小活动组成,这些活动要么全部成功,要么全部失败。 1.2.本地事务 在计算机系统中,更多的是通过关系型数据库来控制事务,利用数据库本身的事务特性来实现&a…...

【思科、华为、华三、锐捷网络设备巡检命令】

华三 screen-1ength disable 取消分页 displayversion 查看版本 displayclock 查看日期时钟 displayfan 查看风扇状态 displaypower 查看电源信息 displaycpu-usage 查看CPU利用率 displaymemory 查看内存利用率 display environment 查看温度信息 display device 查看设备信息…...

代码随想录算法训练营第五十二天

代码随想录算法训练营第五十二天| 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组 300.最长递增子序列674. 最长连续递增序列718. 最长重复子数组 300.最长递增子序列 题目链接:最长递增子序列 这里是不用处理if nums[i] &l…...

【Linux网络】传输层中UDP和TCP协议

文章目录 1、再谈端口号2、UDP协议3、TCP协议3.1 TCP协议段格式3.2 TCP的三次握手和四次挥手(连接管理机制)3.3 TCP的滑动窗口3.4 TCP的流量控制3.5 拥塞控制3.6 延迟应答和捎带应答3.7 面向字节流和粘包问题3.8 TCP总结 1、再谈端口号 端口号port标识一…...

OpenClaw本地部署指南:千问3.5-9B接口配置与调试技巧

OpenClaw本地部署指南:千问3.5-9B接口配置与调试技巧 1. 为什么选择OpenClaw千问3.5-9B组合 去年我在尝试自动化处理日常工作报告时,发现市面上的RPA工具要么功能臃肿,要么需要将数据上传到云端处理。直到遇到OpenClaw这个开源框架&#xf…...

突破硬件限制:OpenCore Legacy Patcher实现老旧Mac现代化升级的完整方案

突破硬件限制:OpenCore Legacy Patcher实现老旧Mac现代化升级的完整方案 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 在苹果生态系统中&#x…...

利用快马ai快速构建can协议数据监控工具原型

利用快马AI快速构建CAN协议数据监控工具原型 最近在做一个汽车电子相关的项目,需要监控CAN总线上的数据。作为初学者,我对CAN协议的理解还停留在理论层面,实际开发时发现从零搭建解析工具非常耗时。好在发现了InsCode(快马)平台,…...

音频处理必看:短时傅里叶变换(STFT)在语音识别中的5个典型应用场景

音频处理必看:短时傅里叶变换(STFT)在语音识别中的5个典型应用场景 语音识别技术正以前所未有的速度渗透到智能家居、车载系统、客服机器人等日常场景中。作为这项技术的核心算法之一,短时傅里叶变换(STFT)就像一位隐形的音频解码…...

SystemVerilog断言(SVA)避坑指南:从‘能用’到‘好用’,我踩过的那些Glue Logic和变量延时坑

SystemVerilog断言进阶实战:破解Glue Logic与动态延时的工程困局 当你的SVA断言从实验室demo走向真实芯片验证时,总会遇到这样的时刻:精心编写的断言在仿真中突然失效,或是让仿真速度下降了30%,又或是变成团队里没人敢…...

3种突破限制方案让窗口尺寸控制效率提升60%

3种突破限制方案让窗口尺寸控制效率提升60% 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 你是否曾遇到这样的困扰:重要的应用程序窗口被固定尺寸无法调整&#xff0c…...

50天学习FPGA第41天-PCIe的的介绍及使用

目录 简介 配置过程 简介 XDMA是一种DMA/Bridge Subsystem for PCI Express IP,由Xilinx提供。 XDMA IP核设计使用Xilinx提供的DMASubsystem for PCI Express IP是一个高性能、可配置的适用于PCIE 2.0、PCIE 3.0的SG模式DMA,提供用户可选择的AXI4接口或者AXI4-Stream接口。…...

IQuest-Coder-V1-40B-Instruct快速上手:LoRA微调打造专属编程助手

IQuest-Coder-V1-40B-Instruct快速上手:LoRA微调打造专属编程助手 1. 认识IQuest-Coder-V1-40B-Instruct 1.1 新一代代码大模型的特点 IQuest-Coder-V1-40B-Instruct是一款专为软件工程和竞技编程设计的大型语言模型。它基于创新的代码流多阶段训练范式构建&…...

Wan2.2-I2V-A14B与Visio流程图结合:让架构图“动”起来

Wan2.2-I2V-A14B与Visio流程图结合:让架构图"动"起来 1. 静态架构图的痛点与动态化需求 在日常技术方案沟通中,我们经常使用Visio绘制各类架构图、网络拓扑图和业务流程图。这些静态图表虽然能清晰展示系统结构,但在演示数据流向…...

Android系统分区详解:从boot到userdata,一篇文章搞懂所有分区的作用与风险

Android系统分区深度解析:从启动原理到安全操作指南 每次按下Android设备的电源键,背后都隐藏着一套精密的分区协作系统。这些看似抽象的分区名称——boot、system、recovery——实则决定着设备的生死存亡。我曾亲眼见证一位开发者误刷boot分区导致设备变…...