浅析前端的堆栈原理以及深浅拷贝原理

浅析前端的堆栈原理以及深浅拷贝原理
首先来看一个案例
const obj = {name:'hzw',age:18
}
let objName2 = obj
objName2.age = 12
console.log(obj,objName2) // {name: 'hzw', age: 12} {name: 'hzw', age: 12}
这里是不是很奇怪,为什么,为什么我改变objName2的值,第一个obj的值也发生了改变。
那么现在就有人说了,这浅拷贝嘛,有啥好难理解的
那又是为什么会造成这种情况呢,这个时候就必须对前端数据存储的堆栈空间有所了解了,首先来说栈
栈:
第一点:我们必须要明白,前端的堆栈空间是怎么存储的。
前端的简单数据类型,都是存在一个栈内存中,不涉及指针
每次去新声明一个简单数据类型的变量,他都会新开一个栈地址,而新开的栈地址,与原变量是两个没有联系的个体
所以你会发现,简单数据类型不会存在有深浅拷贝的说法。
即衍生出了一个JSON.parse(JSON.stringify(xxx))对一个对象进行深拷贝的方法,原理后面再讲
堆:
前面已经说了,前端JS的简单数据类型,都是存在一个栈内存中
而JS中,他的引用数据类型的值,则是放在一个堆空间中,由指针去指向这个堆空间
下面给一张图来对他进行一个解析
堆栈图

在这里插入图片描述

现在我们回到第一个案例
const obj = {name:'hzw',age:18
}
let objName2 = obj
objName2.age = 12
console.log(obj,objName2) // {name: 'hzw', age: 12} {name: 'hzw', age: 12}
为什么这个值发生变化了呢
因为第一个变量obj,它自己的指针,指向了堆空间中的值{name:'hzw',age:18
},
而第二个变量拥有了一个新的指针,但是这个指针指向的堆空间的值也是{name:'hzw',age:18
},
所以就出现了虽然他们的指针不同,但是所指向的堆空间都是同一个(共用了同一个堆空间)
所以当第二个的age发现了变化,第一个也会变
如下图:

在这里插入图片描述

而为什么这样,obj的值又不会发生改变呢

const obj = {name:'hzw',age:18
}
let objName2 = JSON.parse(JSON.stringify(obj))
objName2.age = 12
console.log(obj,objName2) // {name: 'hzw', age: 18} {name: 'hzw', age: 12}
下面进行一个详细的解析
`JSON.stringify(obj)` 将对象 `obj` 序列化为 JSON 字符串,他变成了一个简单数据类型`JSON.parse(...)` 将这个 JSON 字符串重新解析为一个新的对象,从而产生了一个新的对象即他新开辟了一个堆空间,使的这两个指针指向的并不是同一个堆空间,所以这个时候obj的值就不会发生改变
同时这个方法也不是万能的,只能说满足绝大多数的深拷贝需求
使用 JSON.parse(JSON.stringify(obj)) 进行深拷贝的方法有局限性:
1.  无法复制函数、正则表达式、Date 对象等特殊类型的属性。
2.  会忽略 undefined 值。
3.  会忽略循环引用的情况。
##### 好了,通过这篇文章,是不是对JS中的堆栈类型以及深浅拷贝都有所了解呢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/718958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AirPods Pro 2 耳机推送新固件,苹果Find My功能助力产品成长

苹果公司面向 AirPods Pro 2(包括 USB-C 和 Lightning 版本),推出了全新的测试版固件更新,版本号为 6E188,高于 12 月份发布的 6B34 固件。 苹果和往常一样,并没有提供详细的更新日志或者说明&#xff0c…

算法刷题day20:二分

目录 引言概念一、借教室二、分巧克力三、管道四、技能升级五、冶炼金属六、数的范围七、最佳牛围栏 引言 这几天一直在做二分的题,都是上了难度的题目,本来以为自己的二分水平已经非常熟悉了,没想到还是糊涂了一两天才重新想清楚&#xff0…

力扣区间题:合并区间、插入区间

我们可以将区间按照左端点升序排列,然后遍历区间进行合并操作。 我们先将第一个区间加入答案,然后依次考虑之后的每个区间: 如果答案数组中最后一个区间的右端点小于当前考虑区间的左端点,说明两个区间不会重合,因此…

Java基于springboot的课程作业管理系统

摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,课程作业管理系统当然也不能排除在外。课程作业管理系统是以实际运用为开发背景,运用软件工程原理和开发方法…

Linux常见命令总结

1.创建文件夹 mkdir 目录名 mkdir 文件夹名 创建单个文件夹 mkdir 文件夹1 文件夹2 文件夹3 创建多个文件夹 mkdir -p parent/child 创建多级文件夹 2.创建文件 touch 文件名 touch的主要功能有两个,如果要创建的文件的名称存在,将文件的创建时间修改到当前的系统时间(也…

五种常用的可视化项目管理工具

传统的项目管理通常依赖于文本文档,容易造成误解和混乱。在快节奏的商业环境中,没有哪个项目经理愿意处理繁重的文档流程。 另一方面,可视化项目管理通常使用图表和视觉板来展示复杂的项目信息。因此,项目经理能快速了解关键信息…

基于 rk3566 的 uboot 分析 - dts 加载和 dm 模型的本质

文章目录 一、设备树加载使用1、概述2、第一阶段1) fdtdec_setup2) 总结 3、第二阶段1) kernle dtb 编译打包2) 加载流程2.1) board_init2.2) init_kernel_dtb2.3) rockchip_read_dtb_file2.4) rockchip_read_resource_dtb 3) 总结 二、dm 模型1、树的创建1) device_bind_commo…

使用Matlab计算IGRAv2探空站的Tm和PWV

1. 探空站IGRAv2数据 探空站的Tm常作为真值,去检验Tm线性公式或者ERA5 Tm等的精度 。 探空站PWV常作为真值,去检验GNSS PWV等的精度 2. Tm 的计算方法 Tm 的计算方法有两种在前面的文章有讲,这里用 使用水汽压和温度计算Tm。 ei和 Ti 表示…

本地如何配置支付宝模拟支付场景并结合内网穿透实现公网环境调试开发?

文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问 前言 在沙箱环境调试支付SDK的时候,往往沙箱环境部署在本地,局限性大,在沙箱环境…

还在犹豫学不学?鸿蒙技术是否有前途的最强信号来了

2024年3月3日 上午10 点,深圳官方账号发布了一篇关于鸿蒙技术发展的重要文章,看到这篇文章后我非常激动,忍不住和大家分享一下! 华为鸿蒙系统自提出以来,网友们的态度各不相同,有嘲笑“安卓套壳”的&#…

2024 CHINASHOP丨悠络客AI应用亮点抢鲜看,还有价值百元门票免费送哦!

3月13日-15日,备受国内外关注的第二十四届中国零售业博览会(2024 CHINASHOP)将在上海国家会展中心正式开展!悠络客作为深耕智慧门店15年的公有云人工智能企业,也将带着全新AI产品和智慧门店解决方案亮相展会&#xff0…

Windows系统中ollama下载模型前设置下载路径

Windows系统中ollama下载模型前设置下载路径 一开始设置了用户环境变量 OLLAMA_MODELS,没有效果 添加系统环境变量后,ollama pull和run的模型都到了环境变量中的路径下; 设置完后可以在cmd中检查一下:echo %ollama_models% ollam…

Electron 多显示器渲染

Electron打出的包,如果当前有俩个显示器,则可以配置当前显示倒哪个显示器上,或者可以配置不同的显示器,启动不同的项目,只在Windows和Linux下测试过,Mac没有真机,可以利用docker安装MacOS环境&a…

使用mapbox navigation搭建一个安卓导航 示例

一.代码示例地址: https://github.com/mapbox/mapbox-navigation-android-examples/tree/main 二. 具体步骤: git clone gitgithub.com:mapbox/mapbox-navigation-android-examples.git Go to app/src/main/res/values Look for mapbox_access_token.…

Sora:探索大型视觉模型的前世今生、技术内核及未来趋势

Sora,一款由OpenAI在2024年2月推出的创新性文生视频的生成式AI模型,能够依据文字说明,创作出既真实又富有想象力的场景视频,展现了其在模拟现实世界方面的巨大潜能。本文基于公开技术文档和逆向工程分析,全面审视了Sor…

pytorch(四)用pytorch实现线性回归

文章目录 代码过程准备数据设计模型设计构造函数与优化器训练过程训练代码和结果pytorch中的Linear层的底层原理(个人喜欢,不用看)普通矩阵乘法实现Linear层实现 回调机制 代码过程 训练过程: 准备数据集设计模型(用来…

国图公考:山东事业编考试即将开始

山东事业编考试时间为2024年3月10日-9.00-11.30分 考试科目为公基写作 准考证打印时间为2024年3月5日9.00-3月10日9.30分 准考证打印入口:山东考试信息网 综合类笔试在全省十六市均设置考点,参加考试的考生可凭借准考证和本人身份证参加笔试

Python爬虫实战(基础篇)—13获取《人民网》【最新】【国内】【国际】写入Word(附完整代码)

文章目录 专栏导读背景测试代码分析请求网址请求参数代码测试数据分析利用lxml+xpath进一步分析将获取链接再获取文章内容测试代码写入word完整代码总结专栏导读 🔥🔥本文已收录于《Python基础篇爬虫》 🉑🉑本专栏专门针对于有爬虫基础准备的一套基础教学,轻松掌握Py…

第 2 个 Java Web 应用工程(JSP JavaBean DB)(含源码)(图文版)

JavaBean 是一种符合特定约定的 Java 类,通常用于在 Java 应用程序中封装数据以及提供对数据的访问和修改方法。 本文示例:建立一个 Tomcat 工程,编写一个 JSP 页面,调用 JavaBean 访问数据库并显示到页面上,发布到 T…

音视频数字化(视频线缆与接口)

目录 1、DVI接口 2、DP接口 之前的文章【音视频数字化(线缆与接口)】提到了部分视频线缆,今天再补充几个。 视频模拟信号连接从莲花头的“复合”线开始,经历了S端子、色差分量接口,通过亮度、色度尽量分离的办法提高画面质量,到VGA已经到了模拟的顶峰,实现了RGB的独立…