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

深浅拷贝的理解

1 先理解数据类型:
基本数据类型(String, Number, Boolean, Null, Undefined,Symbol)和复杂数据类型(对象)Object 。
基本数据类型的特点:直接存储在栈(stack)中的数据
引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里
引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
简单一点就是可以把栈看成是熟的目录页(基本),堆是内容(复杂)。
二:深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。

深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
三:浅拷贝实现的方式
1、Object.assign()
Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。但是 Object.assign() 进行的是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身。
注意:当object只有一层的时候,是深拷贝

2、Array.prototype.concat() 修改新对象会改到原对象:

3、Array.prototype.slice() 同样修改新对象会改到原对象:
四深拷贝实现方式
1、JSON.parse(JSON.stringify())
原理: 用JSON.stringify将对象转成JSON字符串,再用JSON.parse()把字符串解析成对象,一去一来,新的对象产生了,而且对象会开辟新的栈,实现深拷贝。
这种方法虽然可以实现数组或对象深拷贝,但不能处理函数。
2、手写递归方法
递归方法实现深度克隆原理:遍历对象、数组直到里边都是基本数据类型,然后再去复制,就是深度拷贝。
3、函数库lodash
该函数库也有提供 _.cloneDeep 用来做 Deep Copy。

相关文章:

  • Django里自定义用户登陆及登陆后跳转到登陆前页面的实现
  • PHP导入Excel和导出数据为Excel文件
  • DOM事件模型 DOM事件流 自定义事件(模拟事件)
  • 计算几何初步-三点顺序
  • 模块化,简单一点
  • 蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例
  • GET和POST的区别,何时使用POST?
  • Android 之内容提供程序(Content Provider)
  • 同源策略 跨域
  • matlab基本粒子群算法实现(三)
  • saltstack知道这些就很好用了
  • Es6中常用的新特性
  • Producer和Consumer
  • router 和route push和replace的区别
  • 测试php解析
  • 0x05 Python数据分析,Anaconda八斩刀
  • angular组件开发
  • bearychat的java client
  • CSS 专业技巧
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • JavaScript服务器推送技术之 WebSocket
  • js 实现textarea输入字数提示
  • js正则,这点儿就够用了
  • php的插入排序,通过双层for循环
  • python大佬养成计划----difflib模块
  • ucore操作系统实验笔记 - 重新理解中断
  • webpack入门学习手记(二)
  • 大快搜索数据爬虫技术实例安装教学篇
  • 力扣(LeetCode)357
  • 一道面试题引发的“血案”
  • 源码安装memcached和php memcache扩展
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​决定德拉瓦州地区版图的关键历史事件
  • #{}和${}的区别?
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .NET 4.0中的泛型协变和反变
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET Core引入性能分析引导优化
  • .NET Core中Emit的使用
  • .NET程序员迈向卓越的必由之路