JS中浅拷贝和深拷贝

news/2024/7/11 0:44:52 标签: javascript, 前端, es6

  本篇文章咱们一起来学习下JS中的浅拷贝和深拷贝,了解它们在内存上的区别,并掌握浅拷贝和深拷贝的常用实现方法。

引用赋值

  在学习拷贝之前,咱们先来看一个常见的情景,如下图:

  大家觉得这是深拷贝还是浅拷贝,或者是其他的?

  答案是这种方式是引用赋值,它既不是深拷贝,也不是浅拷贝。在内存上的体现是person1和person2的内存指针都指向同一个堆内存对象,验证方式如下图:

  从输出结果可以看到修改person1和surname属性,person2的surname属性也发生了更改。

浅拷贝

  浅拷贝比较常见的实现方法是通过展开运算符(展开运算符被允许使用在对象字面量声明的时候),如下图:

  在内存上的体现是person1和person2分别指向不同的堆内存对象,验证方式如下图:

  从输出结果可以看到person2的surname属性并没有因为person1的surname属性发生改变而改变。

深拷贝

  通常用于复杂类型的拷贝,同时咱们也可以用来反向证明一下展开运算符是浅拷贝,代码如下图:

  从输出结果可以看到,1号小人的朋友从钱姓朋友变成了孙姓朋友,而2号小人的朋友姓氏也随之改变,这就说明person1和person2的friend指向的是同一个堆内存对象,而深拷贝需要将嵌套的每一层的对象都拷贝成全新的堆内存对象,常用的实现方法如下图:

  通过JSON.stringify方法将person1对象转为JSON,再通过JSON.parse方法将JSON字符串转化为全新的JS对象,从而实现深拷贝,验证方式如下图:

  从输出结果可以看到,1号小人的朋友从钱姓朋友变成了孙姓朋友,2号小人的朋友仍然是钱姓朋友。


http://www.niftyadmin.cn/n/5271896.html

相关文章

Python语言学习笔记之十二(FastAPI)

本课程对于有其它语言基础的开发人员可以参考和学习,同时也是记录下来,为个人学习使用,文档中有此不当之处,请谅解。 1、认识FastAPI FastApi,一个用于构建API的现代、快速(高性能)的web框架。它使用Python 3.6的类型…

信息收集 - 渗透测试工具

渗透测试工具分类 1) 信息收集: 端口扫描:nmap网络路径:tracert、ping等Nmap (kali有安装) Nmap是一款端口扫描器,可用于扫描网络中指定主机的端口开放状况。Nmap支持使用Lua语言编写的脚本,以实现对主机的自动化扫描。通过扫描网络中指定主机的端口开放状况,Nmap可以…

【Vulnhub 靶场】【IA: Keyring (1.0.1)】【中等】【20210730】

1、环境介绍 靶场介绍:https://www.vulnhub.com/entry/ia-keyring-101,718/ 靶场下载:https://download.vulnhub.com/ia/keyring-v1.01.ova 靶场难度:中等 发布日期:2021年07月30日 文件大小:1.1 GB 靶场作者&#xf…

初创公司和小型企业必看:2024年六款最佳免费开源工单管理系统

免费开源工单管理系统包括:1.PingCode:免费 IT 工单管理系统;2.OTRS:海外ITSM 工单系统;3.osTicket:PHP开源工单系统;4.Request Tracker: IT 和运维工单系统;5.Bugzilla&…

OpenCV4工业缺陷检测的六种方法

【文末送书】今天推荐一本机器视觉领域优质书籍 机器视觉 机器视觉是使用各种工业相机,结合传感器跟电气信号实现替代传统人工,完成对象识别、计数、测量、缺陷检测、引导定位与抓取等任务。其中工业品的缺陷检测极大的依赖人工完成,特别是…

力扣---最长回文子串(动态规划)

目录 ​编辑 题目 思路步骤: 代码 我的其他博客 题目 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例 1: 输入:s "babad" 输出&…

AXure的情景交互

目录 导语: 1.erp多样性登录界面 2.主页跳转 3.省级联动​编辑 4. 下拉加载 导语: Axure是一种流行的原型设计工具,可以用来创建网站和应用程序的交互原型。通过Axure,设计师可以创建情景交互,以展示用户与系统的交…

[Verilog] Verilog 数据类型

主页: 元存储博客 文章目录 前言1. bit 类型2. reg 类型3 wire类型4 integer类型5 real类型6 parameter类型7 enum类型8 array 类型9 向量类型10 time 类型11 string 类型 前言 在 Verilog 中,有几种不同的数据类型可以用于声明和操作变量。 在 Verilo…