js深拷贝和浅拷贝

news2024/9/23 1:36:52

👉十分钟学会 前端面试题 js 深拷贝与浅拷贝_前端深拷贝和浅拷贝面试题_Mar-30的博客-CSDN博客

目录

背景:

概念:核心是创建新地址

方法:

浅拷贝:

Object.assign() 方法:Object.assign(拷贝的对象,原始对象)

... 展开运算符方法:{...原始对象}

浅拷贝的局限性(bug): 

深拷贝:

通过递归实现深拷贝:

注意:在递归函数内部调用fn前加上return

JSON.stringify()   JSON.parse()方法(工作使用):

这种方法的缺陷:函数方法和undefined会丢失

lodash:


背景:

        开发中我们经常需要复制一个对象。如果直接用赋值会有问题:将对象p1赋值给p2,改变p2里面属性的值,p1里面对应的值也会被改变。改变原因:因为赋值的时候,是直接拷贝对象栈里面的地址,p1和p2的地址相同,所以修改会将两个一起改变。(p1和p2可以看下面代码)

概念:核心是创建新地址

浅拷贝: 将一个对象的所有属性拷贝到另一个对象  (并且改变拷贝的对象, 不影响原始对象);浅拷贝只能拷贝一层对象,或者一层数组

深拷贝: 将一个对象的所有属性拷贝到另一个对象  (并且改变拷贝的对象, 也不影响含多层对象的原始对象); 

方法:

浅拷贝:

Object.assign() 方法:Object.assign(拷贝的对象,原始对象)

<script>
        // 创建一个p1对象
        const p1 = {
            name: '小白',
            age: 18
        }
 
        const p2 = {}
        Object.assign(p2, p1)
        console.log(p2); //{ name: '小白',age: 18}
 
        p2.name = '小黑'
        console.log(p2); //{name: '小黑', age: 18}
        console.log(p1); //{ name: '小白',age: 18}
    </script>

... 展开运算符方法:{...原始对象}

 <script>
        // 创建一个p1对象
        const p1 = {
            name: '小白',
            age: 18
        }
 
        const p2 = {...p1}
        console.log(p2); //{ name: '小白',age: 18}
 
        p2.name = '小黑'
        console.log(p2); //{name: '小黑', age: 18}
        console.log(p1); //{ name: '小白',age: 18}
    </script>

浅拷贝的局限性(bug): 

浅拷贝的问题: 当原始对象里面的属性值是复杂数据类型的时候, 浅拷贝就会有bug,浅拷贝没有对这个值创建新地址。简单来说就是浅拷贝: 只能拷贝一层对象,或者一层数组

bug的来源就是:如果原始对象有嵌套对象的时候,那么他还是采用等号赋值, 地址依然一样,在堆里面值只有一份

点开第一个p2的打印,所指向的内存地址已经发生了变化,进而数组项数据也发生了变化。 

数组的变异方法会直接改变数组的内存地址,就是改变原数组,由于数组是引用数据类型(复杂数据类型),内存地址是一样的,显示的是原来的结果。但包含修改后的结果.(浅拷贝,拷贝栈里面的指针)。👉js之数组打印看到长度和实际长度不同(浅拷贝)_js 数组添加线上的 4 结果只有2_六卿的博客-CSDN博客

深拷贝:

通过递归实现深拷贝:

        函数递归: 如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。简单理解:函数内部自己调用自己, 这个函数就是递归函数。递归函数的作用和循环效果类似,由于递归很容易发生“栈溢出”错误(stack overflow),所以必须要加退出条件 return

递归实现深拷贝:代码如下

注意:在递归函数内部调用fn前加上return

原因:在递归函数内部调用fn时没有return,也就没有值返回给最外层的函数

👉JS递归函数return返回undefined_js递归返回undefined_醒醒快学习的博客-CSDN博客 

JSON.stringify()   JSON.parse()方法(工作使用):

1、JSON.stringify() 将对象转换为字符串;2、JSON.parse() 转换为复杂数据类型

为什么可以这样写:因为关键就是创建新地址,字符串是普通数据类型,地址在栈里面;JSON.stringify()转换成字符串就是一个新地址  。

这种方法的缺陷:函数方法和undefined会丢失

lodash:

  利用js库 lodash里面的  _.cloneDeep()

  lodash工具库:https://www.lodashjs.com/  

 <script src="./lodash.min.js"></script>
    <script>
        // 1.创建初始对象
        const p1 = {
            name: '小白',
            age: 18,
            address: {
                province: '北京',
                citys: '东城区'
            }
 
        }
 
        // 转换
        const p2 = _.cloneDeep(p1) //深拷贝
        console.log(p2); //{ name: '小白',age: 18,address: {province: '上海', citys: '东城区'}}
 
        // 3.改变拷贝对象里面的 多层对象的值,原始的对象里面的值就不会被改变了
        p2.address.province = '上海'
        console.log(p2); //{ name: '小白',age: 18,address: {province: '上海', citys: '东城区'}}
        console.log(p1); //{ name: '小白',age: 18,address: {province: '北京', citys: '东城区'}}
    </script>

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

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

相关文章

k8s证书过期

[rootmaster1 ~]# kubectl get nodes Unable to connect to the server: x509: certificate has expired or is not yet valid: current time 1.master服务器&#xff1a; # 备份 kubernetes配置 cp -r /etc/kubernetes /etc/kubernetes_bak # 检测证书过期 kubeadm certs…

数智荣耀丨美格智能荣登2023年度中国数智转型标杆企业榜

5月31日&#xff0c;2023数智产业领袖峰会在北京召开&#xff0c;本届大会由智次方—物联网智库主办&#xff0c;大会以大模型时代的“破”与“立”为主题&#xff0c;汇聚产业领袖、专家学者、投资机构、创新企业等各界精英&#xff0c;共同探讨企业如何利用新技术实现“破圈”…

【地平线X3M平台点亮sensor出现问题的分析】

转自地平线论坛经验 1. IC通讯失败的问题以及排查方法。 外界的图像数据一般是通过sensor感知&#xff0c;然后通过mipi接口进入到地平线X3M这款AI芯片的视频处理模块&#xff0c;模块对视频图像做比如放大、缩小、旋转等处理。 问题&#xff1a;IC通讯失败&#xff0c;错误…

手机MT4平台怎么样?手机版MT4平台使用教程教学

外汇是一个全球化的去中心化交易市场&#xff0c;与股票这样只提供一种报价的集中交易不同&#xff0c;在外汇市场中&#xff0c;货币的报价都不是单一的&#xff0c;意味着不同的外汇交易平台的报价会有所不同。以前外汇交易散户是很难进入市场的&#xff0c;参与者主要是银行…

功能强大UI美观的视频答题猜歌闯关娱乐微信小程序源码

正文&#xff1a; 功能强大UI美观的视频答题猜歌闯关娱乐微信小程序源码下载 后台管理资源本地化带数据和视频教程&#xff0c;这是一款拥有后端的闯关娱乐小程序。支持个人小程序和企业小程序上线运营功能强大齐全,带数据本地化(数据在自己服务器自己管理无需担心第三方失效…

【TCP 协议3】提高效率的五大机制

文章目录 前言一、滑动窗口与高速重传1, 什么是滑动窗口2, 什么是高速重传2.1, ack 丢包2.2, 数据丢包 二、流量控制1, 什么是流量控制 三、拥塞控制1, 什么是拥塞控制 四、延迟应答1, 什么是延迟应答 五、捎带应答1, 什么是捎带应答 总结 前言 各位读者好, 我是小陈, 这是我的…

Ansible基础3——playbook

文章目录 一、基本了解二、编写playbook2.1 单剧本2.2 多剧本2.3 特权升级2.4 语法优化 三、模块查找 一、基本了解 为什么要写playbook&#xff1f; 前面我们可以使用临时命令对受控机进行操作&#xff0c;但当有重复性的工作时就不能这么玩了&#xff0c;因为你要一遍遍的去执…

攻防世界-easy_RSA

题目如下&#xff1a;在一次RSA密钥对生成中&#xff0c;假设p473398607161&#xff0c;q4511491&#xff0c;e17 求解出d 1. RSA算法介绍 RSA算法是一种非对称加密算法&#xff0c;由三位计算机科学家Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出并命名。 它采用一…

Vue 基础组件二次封装的高级技巧及方法,能更优雅的进行二次封装组件(props 属性和 event 事件的透传、子组件插槽暴露、第三方组件方法继承)

前言 本人持续开源了Vue2基于ElementUi&AntdUi再次封装的Tui基础组件和Vue3基于Element-plus再次封装的TuiPlus基础组件,在组件封装的过程中提取了 props 属性和 event 事件的透传、子组件插槽暴露等&#xff0c;借此总结一下&#xff01;&#xff01;大佬略过&#xff01;…

把VS Code打造成后端开发的宇宙IDE,也挺爽

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注&#xff01; 作者&#xff1a;维生素P|慕课网优质作者 工欲善其事必先利其器&#xff0c;提高程序员的开发效率必须要有一个好的开发工具。而一旦提到开发工具&#xff…

深度解析Linux读写锁逻辑

一、Linux为何会引入读写锁&#xff1f; 除了mutex&#xff0c;在linux内核中&#xff0c;还有一个经常用到的睡眠锁就是rw semaphore&#xff08;后文简称为rwsem&#xff09;&#xff0c;它到底和mutex有什么不同呢&#xff1f;为何会有rw semaphore&#xff1f;无他&#x…

[Mysql_DB]自动写入系统时间——注意低版本数据库操作

创建商品表包含字段create_time和update_time,并设置默认值为当前时间 实例 使用 CREATE TABLE 语句来创建一个商品表&#xff0c;并为其添加 create_time 和 update_time 字段&#xff0c;同时将这两个字段的默认值设置为当前时间。以下是一个示例&#xff1a; CREATE TABLE …

最新版本 Stable Diffusion 开源 AI 绘画工具之文本转换(Embedding)以及脚本(Script)高级使用篇

✨ 目录 &#x1f388; 文本转换 / Textual Inversion&#x1f388; 自定义Embedding / Textual Inversion&#x1f388; 脚本 / Script&#x1f388; 脚本 / Prompt matrix&#x1f388; 脚本 / X/Y/Z plot &#x1f388; 文本转换 / Textual Inversion 这个功能其实就是将你…

SuperMap Hi-Fi 3D SDK for Unity制作游戏引擎材质

kele 一、使用背景 在交通&#xff0c;电力&#xff0c;规划等行业中&#xff0c;有的对象常常具有很强的质感&#xff0c;比如金属质感的 钢轨&#xff0c;电力塔&#xff1b;陶瓷材质的绝缘子&#xff1b;玻璃材质的建筑幕墙等&#xff0c;但常规方式的表现效果 往往差强人意…

AUTOSAR APP临摹1~Quick Start 模块

已实现逻辑 demo5 页面跳转 mainwindow.ui相当于simulink界面点击Quick Start进入welcome.ui界面在welcome.ui中大概包含7个页面页面之间通过next、back按钮翻页第0页没有back、最后一页点击next退出welcome.ui&#xff0c;回到mainwindow.ui 条件显示 C/C选项页面中&#xff…

7 步提升私有化部署的极狐GitLab 实例安全等级

目录 指导准则 分层安全&#xff0c;纵深防御 保密 ≠ 安全 减少攻击面 7 步保障私有化部署实例安全 第一步&#xff1a;开启多因素认证 第二步&#xff1a;加强额外的注册检查 第三步&#xff1a;限制群组和项目可见性 第四步&#xff1a;强化 SSH 设置 第五步&…

labelimg闪退解决方法(之前使用过labelimg,但新一次使用,打开文件夹无反应,再次打开闪退的问题)

问题描述&#xff1a; 之前使用过labelimg进行好多次的标注&#xff0c;但新一次运行使用&#xff0c;发现打开目录无反应&#xff0c;再次打开闪退的问题&#xff0c;重启电脑并且从新运行labelimg仍然无效。 解决方法&#xff1a; 关闭labelimg&#xff0c;然后删除文件C…

RK平台使用i2c-tools调试

简介 i2ctool是嵌入式开发过程中调试i2c设备常用的工具包&#xff0c;其中比较常用的有&#xff1a;i2cdetect、i2cdump、i2cset、i2cget。 RK平台的SDK大部分默认都会带这个工具&#xff0c;如果没有编译进去或者找不到的情况下可以自己从网上下载编译进去&#xff1a;https:…

数据结构与算法08:二分查找和哈希算法

目录 【二分查找】 二分查找的特殊情况 【哈希算法】 应用一&#xff1a;安全加密 应用二&#xff1a;唯一标识 应用三&#xff1a;数据校验 应用四&#xff1a;散列函数 应用五&#xff1a;负载均衡 应用六&#xff1a;数据分片 应用七&#xff1a;分布式存储&…

vscode:快捷输入代码片段

背景 每次调试代码输入 console.log() 的时候都会想&#xff0c;有没有什么指令我按下了就能生成这行代码&#xff0c;甚至更多我想自定义的代码&#xff0c;然后就去搜了搜果然有&#xff0c;vscode 提供了自定义代码片段的功能。 步骤 打开 vscode&#xff0c;点击 Prefer…