网站首页 > 开源技术 正文
深拷贝与浅拷贝的区别?如何实现一个深拷贝
在回答这个问题前,我们先来回顾一下JS中两大数据类型
- 基本类型 Undefined、Null、Boolean、Number、String
- 引用类型 Object Array
基本类型
基本类型就是值类型, 存放在栈(stack)内存中的简单数据段,数据大小确定,内存空间大小可以分配
引用类型
引用类型, 存放在堆(heap)内存中的对象,变量实际保存的是一个指针,这个指针指向另一个位置
根据上面的分析,我们分别是两处类型做一个copy处理
let obj = { name: '每日一题', value: 'JS' } let obj2 = obj let obj3 = obj.name console.log(obj2.value) //JS console.log(obj3) // 每日一题 // 改变obj2,obj3 obj2.value='css' obj3='html' console.log(obj.value) //css console.log(obj.name) //每日一题
从上面的输出结束来看,我们可以猜测obj,obj2操作的是同一个对象,而obj和obj3是完全独立的, 说到这里就进入了深浅拷贝
浅拷贝
概念: 对于字符串类型,浅拷贝是对值的复制,对于对象来说,浅拷贝是对对象地址的复制, 也就是拷贝的结果是两个对象指向同一个地址
基本概念回过头去看上面的代码我们就能分析出来其都是浅复制
深拷贝
概念: 深拷贝开辟一个新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性
如何实现深拷贝
JSON.stringify()
首先安利一个无脑黑科技骚操作
* 缺点: JSON.stringify()无法正确处理函数
let obj = { name: '每日一题', value: 'JS' } let obj2 = obj let obj3 = obj.name console.log(obj2.value) //JS console.log(obj3) // 每日一题 // 改变obj2,obj3 obj2.value='css' obj3='html' console.log(obj.value) //css console.log(obj.name) //每日一题
递归
讲到深copy很多人都会想到extend方法,没错,这玩意deep为true确实能深copy,我们就过来翻一翻他的源码
这边以大家熟悉的jquery为例
// 源码地址 https://github.com/jquery/jquery/blob/5bdc85b82b84e5459462ddad9002f22d1ce74f21/src/core.js#L125
总结
- 浅拷贝是复制,两个对象指向同一个地址
- 深拷贝是新开栈,两个对象指向不同的地址
- 上一篇: 2023 年最受前端开发欢迎的10大构建工具
- 下一篇: 如何”有效“减小js包的体积(js放大缩小)
猜你喜欢
- 2024-09-10 Facebook发新版React,这些新功能让程序员直呼强大!
- 2024-09-10 React Native 网络层分析(react-native-router-flux)
- 2024-09-10 Brisk-Admin基于vue3+element-plus+vite开箱即用后台前端框架
- 2024-09-10 前端性能优化,你想知道的都在这里
- 2024-09-10 AngularJS2 教程—JavaScript 环境配置—架构大全第一章
- 2024-09-10 「免费开源」基于Vue和Quasar的动态表关系管理(六)
- 2024-09-10 2018年前端流行哪些技术?(推荐收藏)
- 2024-09-10 你还在用 for 循环遍历集合?试试 JavaScript 新增的 7 种方法吧!
- 2024-09-10 Vue开发中常用的ES6新特性(vue支持es几)
- 2024-09-10 在线编辑excel功能一次完整体验历程,以及可以避免的坑
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)