面试题:说一说深拷贝和浅拷贝?

news2025/1/17 0:04:12

JavaScript中存在两大数据类型: 基本类型 和 引用类型

基本类型数据保存在在栈内存中
引用类型数据保存在堆内存中,引用数据类型的变量是一个指向堆内存中实际对象的引用,存在栈中

深拷贝和浅拷贝都只针对于引用类型。

一、 浅拷贝:拷贝的是地址。如下就是一个浅拷贝的方法:

1、拓展运算符

在这里插入图片描述

先了解一下Object.assign方法,如下图所示:

在这里插入图片描述

简单对象用Object.assign()方法实现浅拷贝如下:这是es6新增的。

2、Object.assign()

在这里插入图片描述

总结:浅拷贝只拷贝一层简单数据类型(即,简单数据类型只会拷贝值),但是对于更深层次的对象,只会拷贝它的地址。

简单理解:浅拷贝,如果拷贝的是单层对象,就没问题,如果有多层就有问题。

问题1:直接赋值和浅拷贝有什么区别?

答:直接赋值的方法,只要是对象,都会相互影响,因为是直接拷贝对象栈里面的地址。

浅拷贝如果是一层对象,不相互影响,如果出现多层对象拷贝还会相互影响。

问题2:浅拷贝怎么理解?

答:拷贝对象之后,里面的属性值是简单数据类型直接拷贝值。

如果属性值是引用数据类型则拷贝的是地址。

二、深拷贝:拷贝的是对象,不是地址

常见方法:1、通过递归实现深拷贝;2、lodash/cloneDeep;3、通过JSON.stringify()实现

1、递归深拷贝(简易版)

在这里插入图片描述

先理解一下下面这段代码:这个代码只解决了数组的问题,但是没解决对象的问题。

在这里插入图片描述
在这里插入图片描述

再加上下面这段代码,就能解决数组和对象的问题了

在这里插入图片描述

注意:一定要先把数组写在前面,因为数组也属于对象形式,万物皆对象,即:先筛选完数组之后,再筛选对象。

问:做过深拷贝吗?说一下深拷贝是怎么实现的。

答:做过,深拷贝啊做出来对象,新对象不会影响旧对象,要想实现深拷贝,第一啊,深拷贝要用到函数递归,当我们在普通拷贝的时候没问题,直接进行赋值就行了;但是如果遇到数组的,我们再次调用这个递归函数就可以了;如果遇到的是对象形式,那我再次利用递归,把对象解决;但是一定要先递归数组,再递归对象。

2、js库lodash里面cloneDeep内部实现了深拷贝。

官网解释如下:

在这里插入图片描述

代码如下:

在这里插入图片描述

JSON对象的Stringify和Parse来实现深拷贝。要了解弊端

理解:类似于阳澄湖大闸蟹,把其他的螃蟹拿进阳澄湖里涮一涮,再拿出来,就成了阳澄湖大闸蟹,表面看起来一样,其实完全不一样。

在这里插入图片描述

该方法的弊端:

1、obj里面有new Date(),深拷贝后,时间会变成字符串的形式。而不是时间对象;

2、obj里有function,undefined,则序列化的结果会把function或 undefined丢失;

3、obj里有NaN,则序列化的结果会变成null;

4、JSON.stringify()只能序列化对象的可枚举的自有属性,如果obj中的对象是由构造函数生成的实例对象, 深拷贝后,会丢弃对象的constructor;

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

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

相关文章

31.利用linprog 解决 投资问题(matlab程序)

1.简述 语法:[X,FVAL] linprog(f,a,b,Aeq,Beq,LB,UB,X0); X 为最终解 , FVAL为最终解对应的函数值 *注意:求最大值时,结果FVAL需要取反* f 为决策函数的系数矩阵。 *注意:当所求为最大值…

代码随想录算法训练营第六天| 454.四数相加II,383. 赎金信的交集, 15.三数之和(需要二刷) 18.四数之和(需要二刷)

454.四数相加II 暴力超时 class Solution {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {//超出时间限制//分别从4个数组中任选一个,四数相加0int n nums4.length,index0;int count0;int[] arr1new int[n*n];int[] arr2new i…

机器学习:训练集与测试集分割train_test_split

1 引言 在使用机器学习训练模型算法的过程中,为提高模型的泛化能力、防止过拟合等目的,需要将整体数据划分为训练集和测试集两部分,训练集用于模型训练,测试集用于模型的验证。此时,使用train_test_split函数可便捷高…

Go语言性能优化建议与pprof性能调优详解——结合博客项目实战

文章目录 性能优化建议Benchmark的使用slice优化预分配内存大内存未释放 map优化字符串处理优化结构体优化atomic包小结 pprof性能调优采集性能数据服务型应用go tool pprof命令项目调优分析修改main.go安装go-wrk命令行交互界面图形化火焰图 性能优化建议 简介: …

python用来做什么的,python用来干什么的

大家好,小编为大家解答python用来干什么的的问题。很多人还不知道python用来做什么的,现在让我们一起来看看吧! 编程语言python是用来干什么的? python的作用: 1、系统编程:提供API(ApplicationProgrammin…

【算法提高:动态规划】1.3 背包模型 TODO

文章目录 例题列表423. 采药(01背包)1024. 装箱问题(大小和价值相等的01背包)1022. 宠物小精灵之收服(二维费用的背包问题)补充:相关题目——8. 二维费用的背包问题 278. 数字组合(0…

阿里云负载均衡SLB网络型NLB负载均衡架构性能详解

阿里云网络型负载均衡NLB是阿里云推出的新一代四层负载均衡,支持超高性能和自动弹性能力,单实例可以达到1亿并发连接,帮您轻松应对高并发业务。网络型负载均衡NLB具有超强性能、自动弹性伸缩、高可用、TCPSSL卸载、多场景流量分发和丰富的高级…

【初阶C语言】数组

目录 一、一维数组 1.一维数组的创建和初始化 2.一维数组的使用 3.一维数组在内存中的存储 二、二维数组 1.二维数组的创建 2.二维数组的初始化 3.二维数组的使用 4.二维数组在内存中的存储 三、数组的越界问题 四、数组传参 前言: 数组在C语言中是一个…

express学习笔记6 - 用户模块

新建router/user.js const express require(express) const routerexpress.Router() router.get(/login, function(req, res, next) {console.log(/user/login, req.body)res.json({code: 0,msg: 登录成功})})module.exportsrouter 在router/user.js引入并使用 const us…

一起学算法(链表篇)

1.链表的概念 对于顺序存储的结构最大的缺点就是插入和排序的时候需要移动大量的元素&#xff0c;所以链表的出生由此而来 先上代码&#xff1a; // 链表 public class LinkedList<T extends Comparable> {// 结点类class Node {T ele; // 当前结点上的元素内容Node ne…

java学习路程之篇四、进阶知识、石头迷阵游戏、绘制界面、打乱石头方块、移动业务、游戏判定胜利、统计步数、重新游戏

文章目录 1、绘制界面2、打乱石头方块3、移动业务4、游戏判定胜利5、统计步数6、重新游戏7、完整代码 1、绘制界面 2、打乱石头方块 3、移动业务 4、游戏判定胜利 5、统计步数 6、重新游戏 7、完整代码 java之石头迷阵单击游戏、继承、接口、窗体、事件、组件、按钮、图片

【Spring】Spring 中事务的实现

目录 1.编程式事务&#xff08;手动编写代码&#xff09;2.声明式事务&#xff08;利用注解&#xff09;2.1 Transactional作用范围2.2 Transactional参数说明2.3 Transactional工作原理 3.Spring 中设置事务隔离级别3.1 事务四大特性ACID3.2 事务的隔离级别3.2 Spring中设置事…

(13) Qt事件系统(two)

目录 事件分发函数 无边框窗口拖动 自定义事件 发送事件的函数 自定义事件 系统定义的事件号 自定义事件号 自定义事件类 发送和处理事件 sendEvent与postEvent的区别 栈区对象 堆区对象 事件传播机制 事件传播的过程 事件传播到父组件 鼠标单击事件与按钮单击信…

【STM32零基础入门教程03】GPIO输入输出之GPIO框图分析

本章节主要讲解点亮LED的基本原理&#xff0c;以及GPIO框图的讲解。 如何点亮LED&#xff08;输出&#xff09; 首先我们查看原理图&#xff0c;观察电路图中LED的连接情况&#xff0c;如下图可以看出我们的板子中LED一端通过限流电阻连接的PB0另一端连接的是高电平VCC&#xf…

30. 利用linprog 解决 生产决策问题(matlab程序)

1.简述 线线规划的几个基本性质&#xff1a;【文献[1]第46页】 (1)线性规划问题的可行域如果非空&#xff0c;则是一个凸集-凸多面体&#xff1b; (2)如果线性规划问题有最优解&#xff0c;那么最优解可在可行域的顶点中确定&#xff1b; (3)如果可行域有界&#xff0c;且可行域…

【数据中台】DataX源码进行二开插件

参考官方 使用的离线数据同步工具/平台&#xff0c;实现不同数据库等各种异构数据源之间高效的数据同步功能 工具部署 https://github.com/alibaba/DataX/blob/master/userGuid.md 拉取下来的代码&#xff0c;pom.xml里面注释 <!--<module>tsdbreader</module&g…

大整数截取解决方法(java代码)

大整数截取解决方法&#xff08;java代码&#xff09; 描述输入描述输出描述输入示例输出示例前置知识&#xff1a;代码 解题思路来自这个博客&#xff1a;简单^不简单 https://blog.csdn.net/younger_china/article/details/126376374 描述 花花有一个很珍贵的数字串&#xf…

P4053 [JSOI2007] 建筑抢修(贪心)(内附封面)

[JSOI2007] 建筑抢修 题目描述 小刚在玩 JSOI 提供的一个称之为“建筑抢修”的电脑游戏&#xff1a;经过了一场激烈的战斗&#xff0c;T 部落消灭了所有 Z 部落的入侵者。但是 T 部落的基地里已经有 N N N 个建筑设施受到了严重的损伤&#xff0c;如果不尽快修复的话&#x…

python项目开发案例集锦,python开发程序流程

大家好&#xff0c;给大家分享一下python项目开发案例集锦 源码&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 今天任务 1.创建Python项目为pythontest1以及test1.py文件 2.修改字号 3.输入九九乘法表程序&#xff0c;编译调试执行 4.配置…

Python selenium对应的浏览器chromedriver版本不一致

1、chrome和chromedriver版本不一致导致的&#xff0c;我们只需要升级下chromedriver的版本即可 浏览器版本查看 //打开google浏览器直接访问&#xff0c;查看浏览器版本 chrome://version/ 查看chromedriver的版本 //查看驱动版本 chromedriver chromedriver下载 可看到浏…