JS-17--深拷贝跟浅拷贝的区别?如何实现一个深拷贝?

news2024/11/17 9:45:28

1、数据类型存储
JavaScript中存在两大数据类型:
基本类型
引用类型
基本类型数据保存在栈内存中
引用类型数据保存到堆内存中,引用数据类型的变量是一个指向堆内存中实际x对象的引用,存在栈中

2、浅拷贝
浅拷贝指的是创建新的数据,这个数据有着原始数据属性值的一份精确拷贝
如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址,
即浅拷贝是拷贝一层,深层次的引用类型则是共享内存地址。
浅拷贝代码:
在这里插入图片描述

在JavaScript中,存在浅拷贝的现象有:
Object.assgin
Array.prototype.slice()、Array.prototype.concat()
使用拓展运算符实现的复制

2.1、 Object.assgin
在这里插入图片描述

2.2、Array.prototype.slice()
在这里插入图片描述

2.3、Array.prototype.concat()
在这里插入图片描述

2.4使用拓展运算符实现的复制
在这里插入图片描述

3、深拷贝
深拷贝开辟了一个新的栈,两个对象属性完全相同,但是对应两个不同的地址,修改一个对象的属性,不会改另一个对象的属性。
常见的深拷贝的方式有:
_.cloneDeep()
jQuery.extend()
JSON.stringify()
手写循环递归
_.cloneDeep()
在这里插入图片描述

jQuery.extend()

在这里插入图片描述

JSON.stringify()

在这里插入图片描述

但是这种方式存在弊端,会忽略undefined、symbo和函数

在这里插入图片描述

手写循环递归

在这里插入图片描述

4、区别
下面通过两张图,可以更加清晰看到浅拷贝和深拷贝的区别
在这里插入图片描述

从上图发现,浅拷贝和深拷贝都创建一个新的对象,但在复制对象属性的时候,行为不一样
浅拷贝只复制属性指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存,修改对象属性会影响原对象

在这里插入图片描述
但深拷贝会另外创建一个一摸一样的对象,新对象跟原对象不共享内存,修改新对象不会改变原对象。
在这里插入图片描述

5、小结
前提为拷贝类型为引用类型的情况下:
浅拷贝是拷贝一层,属性为对象时,浅拷贝是复制,两个对象指向同一地址。
深拷贝是递归拷贝深层次,属性为对象时,深拷贝是新开栈,两个对象指向不同地址。

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

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

相关文章

基于SSM的小型企业办公自动化系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

第二证券:为什么a股放开做空机制?

对于很多一般出资者来说,做空股票是一件十分复杂和困难的工作,可是对于专业的出资者和组织来说,这供给了一个愈加自由的商场买卖环境。那么,为什么A股放开做空机制呢?我们从多个视点来分析: 视点一&#x…

谷歌seo技术流

很多外贸企业和独立站都想从Google获得免费的流量,也就是SEO流量,但是在做SEO的过程中,总会面临这样或那样的问题。米贸搜谷歌推广将这些问题总结如下: 既然SEO看起来似乎很难,但还是有很多电商公司愿意投资SEO&#x…

Nosql数据库服务之redis

Nosql数据库服务之redis 一图详解DB的分支产品 Nosql数据库介绍 是一种非关系型数据库服务,它能解决常规数据库的并发能力,比如传统的数据库的IO与性能的瓶颈,同样它是关系型数据库的一个补充,有着比较好的高效率与高性能。 专…

CSAPP的Lab学习——Archlab(Architecture Lab)

文章目录 前言一、A部分sum .ys:迭代求和链表元素写一个Y86-64的程序和。rsum .递归求和链表元素copy.ys 复制将源块复制到目标块 二、B部分三、C部分实现iaddq指令 总结 前言 一个本硕双非的小菜鸡,备战24年秋招。刚刚看完CSAPP,真是一本神…

Android发布依赖到 Jitpack

前言 我们在日常开发中,经常会用到第三方开源的库文件,有的来自JCenter,Maven Central,google等。但是随着JCenter的弃用,现在用的最多的还是Maven Central,google。今天我们就自己亲自发布一个依赖。 现…

三秋农忙,自动驾驶农机保驾护航

“三秋”(收获、播种、整地)是一年中重要而忙碌的农事季节,水稻、棉花、玉米等农作物收获时期,也是小麦、蔬菜等秋种的好时间,还是各类农作物进入秋管的重要期。 随者农业科技发展,北斗导航农机自动驾驶系…

Json“牵手”唯品会商品详情数据方法,唯品会商品详情API接口,唯品会API申请指南

唯品会是中国最大的会员制特卖电商平台之一,于2008年创立,唯品会主营业务为互联网在线销售品牌折扣商品,涵盖名品服饰鞋包、美妆、母婴、居家等各大品类2。唯品会采取供应链直采模式,与全球3000多家品牌及供应商合作,直…

网络货运平台服务模式,你真的了解吗?

在当今的“互联网”时代,网络货运平台已经成为物流行业中的重要力量。 长期以来,货物运输行业处于“小、散、乱、差”的状态,存在信息不对称、运输环节层层分包等问题。数字时代到来,各行各业都在进行数字升级,物流行…

德国金融监管机构网站遭遇大规模DDoS攻击后“瘫痪”

德国波恩的BaFin大楼 BaFin是负责监督和监管德国金融机构和市场的金融监管机构,其职责是确保德国金融体系的稳定性、完整性和透明度。 此外,BaFin 的网站还为企业和消费者提供银行、贷款和财产融资等方面的信息。它还提供消费者帮助热线和举报人信息共…

分享一些领英添加客户的话术

昨天一个朋友很开心地跟我分享她在领英找到的一个非常优质的客户,她说这个客户很忠诚,基本上每年都会回来找她下单,这两年持续的下单,也没有对比价格,特别感恩遇见这样的客户。 也许是行业和产品不同,我领…

[C++]杨辉三角

目录 题目 解题思路 代码实现 获取数字 打印函数 主函数 全部代码 运行结果 题目 给定一个非负整数numRows ,生成「杨辉三角」的前numRows行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 解题思路 第k列的第i个数字的值第k-1列的(…

合宙Air724UG LuatOS-Air LVGL API控件-加载器(Spinner)

加载器(Spinner) 示例代码 spinner lvgl.spinner_create(lvgl.scr_act(), nil) lvgl.obj_set_size(spinner, 100, 100) lvgl.obj_align(spinner, nil, lvgl.ALIGN_CENTER, 0, 0) 创建 通过 lvgl.spinner_create 就可创建一个加载器,本身自带动画效果。 spinner …

PageHelper分页原理解析

大家好,我是Leo! 今天给大家带来的是关于PageHelper原理的解析,最近遇到一个SQL优化的问题,顺便研究了一下PageHelper的原理,毕竟也是比较常用,源码也比较好看的懂,如果感兴趣的小伙伴可以跟着过程去DEBUG源…

【优选算法】—— 前缀和算法

前言: 本期,我将要带大家学习的是有关前缀和算法的学习!!! 目录 (一)什么是前缀和算法 (二)题目讲解 1、【模板】前缀和 2、【模板】二维前缀和 3、 和可被K整除的…

简明SQL截断和偏移指南:掌握LIMIT实现数据筛选

以下是用到的表。 截断 LIMIT 用于限制查询结果返回的行数,即最多返回多少行数据。 例如,返回前两行数据。 例如,从第二个数据开始返回两条数据(从0开始计算)。 偏移 OFFSET 用于指定查询结果的起始位置&#xff0c…

园区宿舍水电表改造解决方案

随着社会经济的快速发展,人们对生活品质的要求不断提高,园区宿舍作为众多企业员工和学生的居住场所,水电资源的合理使用和节约越来越受到关注。为了更好地满足人们对生活品质的需求,提高水电资源的利用效率,园区宿舍水…

PHP8中查询数组中指定元素-PHP8知识详解

php是使用最广泛的web编程语言,数组是一个数据集合,数组是一种非常常用的数据类型。在操作数组时,有时我们需要查询数组中是否有某个指定元素。在实际的程序开发中,我们用到了下列方法来查询数组中指定的元素:使用arra…

postman返回值乱码

描述: 在使用postman测试接口的时候,结果正常返回,但是乱码了,这个一般都是编码集设定的问题,后端接口是使用的springmvc Controller public class TestController(){RequestMapper("/test8")ResponseBodypublic Strin…

C++QT day2

作业 1> 封装一个结构体,结构体中包含一个私有数组,用来存放学生的成绩,包含一个私有变量,用来记录学生个数, 提供一个公有成员函数,void setNum(int num)用于设置学生个数 提供一个公有成员函数&…