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

浅析前端的堆栈原理以及深浅拷贝原理
首先来看一个案例
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中的堆栈类型以及深浅拷贝都有所了解呢。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

type may not be empty [type-empty]

Git提交失败原因分析 原因是使用了规范commit信息的工具,你的提交信息不符合规范,所以被拒绝了 commit规范工具 commitlinthusky 我这个项目使用husky,提交规范比较严格。 解决方式一: 修改提交信息, 使其符合规范…

代码里没有报错,但是java编译报错找不到符号

问题分析: 最近在尝试maven编译,所以不小心点了mvn clean的命令,将之前编译的工程清除了,导致后边再编译项目上的时候就报了一堆错误。代码没问题,但编译不通过,报找不到符号的错误,搜了下这样解…

Windows安装VNC连接工具并结合cpolar实现远程内网Ubuntu系统桌面

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

Linux测试端口开放

Linux测试端口开放 Linux测试端口是否开放有多种命令,如nc、telnet、ssh、curl、wget nc nc(netcat)可用于创建 TCP 或 UDP 连接、扫描端口、传输文件等 扫描指定端口: nc -zv ip port-z 使用0输入/输出模式,只在…

【C#】SixLabors.ImageSharp和System.Drawing两者知多少

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。…

Docker数据集与自定义镜像:构建高效容器的关键要素

目录 博客前言 一.数据卷 1.数据卷介绍 2.实战 宿主机和容器共享目录 容器和容器之间共享目录 二.自定义镜像 1.自定义镜像介绍 2.实战 2.1自定义centos,具备vim及ifconfig作用 构建镜像 通过镜像运行一个容器进行测试 2.2自定义tomact(文件为…

云桥通+IDC数据中心:SDWAN企业组网实现高效连接案例

一、需求和背景 云桥通曾服务的一家大型跨国企业C公司,C公司多个数据中心分布在全球各地。为了实现数据共享和协作,数据中心之间需要建立稳定高效的网络连接。然而,传统的MPLS专线网络存在昂贵的成本和漫长的开通周期,无法满足企…

轻松获取邀请奖励,提升用户参与度——xinstall免填邀请码功能实战

随着移动互联网的迅猛发展,App推广已成为各大企业争夺市场份额的重要手段。然而,在推广过程中,如何让用户更便捷地参与活动、绑定关系并获取奖励,一直是困扰企业的难题。今天,我们就来聊聊如何通过xinstall的免填邀请码…

初体验通义灵码-JS篇

安装 我是JetBrains IDEs的付费忠粉,使用的他们家的全家桶,故先选择在Webstorm安装通义灵码 按通义灵码的官方指引安装即可:https://tongyi.aliyun.com/lingma/download 使用 安装后重启webstorm,IED左右下会有通义灵码的登录…

python自动化学习--3.8python操作EXCEL文件python日志收集处理

1、Excel文件处理 安装 openpxl 第三方库 openpxl 模块三大组件: 1、工作簿 (包含多个sheet工作表) 2、工作表 (某个数据包含在某个工作表) 3、单元格 1、创建excel工作簿 import openpyxl"""Excel表格的创建…

vue中scss样式污染引发的思考

新做了一个项目,就是在登录后,就会产生左侧菜单的按钮颜色不一样。 然后发现样式是从这里传过来的 发现是登录页面的css给污染了 就是加了scope就把这个问题解决了 然后想总结一下这个思路:就是如何排查污染样式: 如果出现了…

前端同时传递文件数据+非文件数据,前后端解决方案

之前录制视频《文件上传组件》的时候有位观众提了个问题,如果我没有理解错的话,应该就是前后同时传递文件数据 非文件数据,前后端数据该如何接收,这里我给出我自己的解决方案 tip:下文在编写前端代码的时候,用到了这篇…

EAS web 界面加载后,隐藏按钮

效果:隐藏下列按钮: 实现方法: 1、创建数据装载事件: 2、隐藏按钮: afterOnloadHideEntryTBBBBBB:function(e){console.log("----------失败222!!!!!&a…

大数据旅游数据分析:基于Python旅游数据采集可视化分析推荐系统

文章目录 基于Python旅游数据采集可视化分析推荐系统一、项目概述二、项目说明三、开发环境四、功能实现五、系统页面实现用户登录注册系统首页数据操作管理价格与销量分析旅游城市和景点等级分析旅游数据评分情况分析旅游数据评论情况分析旅游景点推荐Django系统后台管理 六、…

技术派数据库表自动初始化(学习)

不需要在db中手动创建或者导入相关的schema、data&#xff0c;项目启动自动创建对应的表&#xff0c;并初始化。实现该过程。 Liquibase数据库版本管理 依赖配置 在paicoding-web模块中&#xff0c;pom.xml 文件中添加 <dependency><groupId>org.liquibase</g…

Java毕业设计 基于SSM SpringBoot vue购物比价网站

Java毕业设计 基于SSM SpringBoot vue购物比价网站 SSM vue 购物比价网站 功能介绍 首页 图片轮播 商品 商品分类 商品详情 评论 收藏 商品攻略 商品信息 公告栏 在线反馈 登录 注册 个人中心 我的收藏 后台管理 登录 注册商品户 个人中心 修改密码 个人信息 商品户管理 用户…

污水处理设备远程监控:HiWoo Cloud如何打造智慧环保新时代

随着工业化和城市化的快速推进&#xff0c;污水处理成为了保护环境、维护生态平衡的重要一环。传统的污水处理设备管理方式往往依赖于人工巡检和现场控制&#xff0c;不仅效率低下&#xff0c;而且难以实时掌握设备的运行状况。在这个背景下&#xff0c;HiWoo Cloud平台推出了污…

如何使用固定公网地址远程访问本地RStudio Server【内网穿透】

文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE&#xff0c;并通过 Web 浏览器进行访问…

【小沐学C++】C/C++包管理工具Conan使用(C++、Python、CMake、Conan)

文章目录 1、简介2、Conan下载安装3、Conan命令3.1 查看conan版本3.2 更新conan库3.3 搜索软件包3.4 显示conan所有源3.5 查看软件包3.6 通过conanfile.txt安装依赖包 结语 1、简介 Conan是C和C语言的依赖项和包管理器。它是免费和开源的&#xff0c;适用于所有平台&#xff0…

知识蒸馏 pytorch官网源码分析

参考连接&#xff1a; Knowledge Distillation Tutorial — PyTorch Tutorials 2.2.1cu121 documentation 方法一 &#xff1a; 知识蒸馏的损失函数只接受两个相同维度的输入&#xff0c;所以我们需要采取措施使他们在进入损失函数之前是相同维度的。我们将使用平均池化…