004-深拷贝浅拷贝

深拷贝&浅拷贝

  • 1、值类型 & 引用类型
  • 2、概念
  • 3、深拷贝
    • 3.1 递归遍历
    • 3.2 JSON.parse(JSON.stringify())
    • 3.3 $.extend
    • 3.4 _.cloneDeep
  • 4、浅拷贝
    • 4.1 扩展运算符
    • 4.2 Object.assign

1、值类型 & 引用类型

值类型:简单数据类型,基本数据类型,在存储时,变量中存储的是值本身,因此叫做值类型。
引用类型:复杂数据类型,在存储时,变量中存储的仅仅是地址(引用),因此叫做引用数据类型。
在 js 中,值类型有:字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、Symbol。
引用数据类型:对象(Object)、数组(Array)

2、概念

浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝。
深拷贝将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝。

const obj1 = {name: 'zhangsan',age: 19,info: {height: '100cm',weight: '30kg',},
};const obj2 = { ...obj1 }; // 浅拷贝
obj2.info.height = '30cm';console.log(obj1.info.height); // 30cm

3、深拷贝

💡 Tips:对象拷贝时,如果 value 存在 引用类型,不想让拷贝对象的修改影响到原对象,需采用深拷贝

3.1 递归遍历

function deepClone(obj) {var objClone = Array.isArray(obj) ? [] : {};if (obj && typeof obj === 'object') {for (key in obj) {if (obj.hasOwnProperty(key)) {if (obj[key] && typeof obj[key] === 'object') {objClone[key] = deepClone(obj[key]);} else {objClone[key] = obj[key];}}}}return objClone;
}

3.2 JSON.parse(JSON.stringify())

💡 Tips:不适用对象 value 存在函数的场景

function deepCloneJson(obj) {let objJson = JSON.stringify(obj);let objClone = JSON.parse(objJson);return objClone;
}

3.3 $.extend

💡 Tips:jquery 中的方法

function deepCloneExtend(arr) {let arrClone = [];arrClone = $.extend(true, [], arr);return arrClone;
}

3.4 _.cloneDeep

💡 Tips:lodash 中的方法

import { cloneDeep } from 'lodash';
const obj1 = {name: 'zhangsan',age: 19,info: {height: '100cm',weight: '30kg',},
};
const obj2 = cloneDeep(obj1);

4、浅拷贝

💡 Tips:对象拷贝时,如果 value 不存在 引用类型,可以采用浅拷贝

4.1 扩展运算符

const obj1 = {name: 'zhangsan',age: 19,
};
const obj2 = { ...obj1 };

4.2 Object.assign

const obj1 = {name: 'zhangsan',age: 19,
};
const obj2 = Object.assign({}, obj1);

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

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

相关文章

msg:xxl-rpc remoting error(connect timed out), for url :

使用xxl定时任务时报错。msg:xxl-rpc remoting error(connect timed out), for url : 最开始找不到解决办法,将以下所有的ipv4地址都试了一遍, 包括ping不通的,也将本机的防火墙关闭处理最后ping通了,但还是无法解决。…

浅谈马尔科夫链蒙特卡罗方法(MCMC)算法的理解

1.解决的问题 计算机怎么在任意给定的概率分布P上采样?首先可以想到把它拆成两步: (1)首先等概率的从采样区间里取一个待定样本x,并得到它的概率为p(x) (2)然后在均匀分布U[0,1]上取一个值&a…

媒体邀约服务主要有哪些工作

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体邀约服务是一项繁琐的沟通工作,下面介绍一下51媒体网的主要工作流程。‘ 明确需求:根据客户的传播需求,制定拟邀请媒体名单供客户筛选。 媒体筛选…

RNN循环神经网络及其梯度消失笔记

资料来源 【重温系列】RNN循环神经网络及其梯度消失 手把手公式推导大白话讲解 带时间序列的任务场景 标准神经网络建模的弊端 RNN循环神经网络 网络结构 多输入,多输出 这里的就是对应识别人名的任务,输入就是这里的x1,x2,输出的自然就是0或1了 这种…

针对有容量的电动汽车路由问题的灵活交叉的修正遗传算法

英文:Modified Genetic Algorithm with Flexible Crossover for The Capacitated Electric Vehicle Routing Problem 摘要 本文提出了一种对遗传算法的修改,用一种叫做灵活交叉操作的新技术来解决有容量的电动汽车路由问题(CEVRP&#xff0…

二百二十七、Linux——通过shell脚本判断HDFS文件是否存在,如果存在则删除HDFS文件

一、目的 在用脚本去实现对HDFS中过期的ODS层原始数据进行删除后,发现还需要在脚本中对HDFS文件是否存在进行判断,否则如果HDFS文件不存在那么任务执行就会报错 报错原因是这一天的HDFS文件并不存在 原有脚本 #! /bin/bash source /etc/profile nowda…

python爬虫之Appium 的使用

Appium 是一个跨平台移动端自动化测试工具,可以非常便捷地为 iOS 和 Android 平台创建自动化测试用例。它可以模拟 App 内部的各种操作,如点击、滑动、文本输入等,只要我们手工操作的动作 Appium 都可以完成。在前面我们了解过 Selenium&…

使用 Docker 设置 PySpark Notebook

使用 Docker 设置 PySpark Notebook 第 1 步:拉取 Docker 镜像 首先拉取jupyter/all-spark-notebook包含 Spark 3.5.0 的镜像。 docker pull jupyter/all-spark-notebook:spark-3.5.0 第 2 步:设置您的工作区 在运行 Docker 映像之前,我们…

开源大数据集群部署(十四)Ranger集成Hbase

作者:櫰木 在hd1.dtstack.com主机上执行 在hmaster和back master上进行安装和执行 解压ranger-2.3.0-hbase-plugin [roothd1.dtstack.com ranger-plugin]# cd /root/bigdata [roothd1.dtstack.com ranger-plugin]# tar -zvxf ranger-2.3.0-hbase-plugin -C /opt配…

Unity编辑器功能Inspector快捷自动填充数据和可视化调试

我们有时候可能需要在面板增加一些引用,可能添加脚本后要手动拖动,这样如果有大量的脚本拖动也是不小的工作量 实例 例如:我的脚本需要添加一个Bone的列表,一个个拖动很麻烦。 实现脚本 我们可以用这样的脚本来实现。 public…

Nginx 域名证书 Http 和 Https 详细配置

小伙伴们好,欢迎关注,一起学习,无限进步 项目开发完成后,将项目部署到服务器上时,为了保证安全性和加密通信,我们通常会配置 Nginx 作为反向代理服务器,并使用域名证书启用 HTTPS。下面将为你指…

小程序API能力集成指南——画布API汇总(一)

RJS Canvas Canvas Canvas 实例, 在 RJS 中可通过 getCanvasById 获取。 属性 number width:画布宽度 number height:画布高度 方法 如下。 1、getContext Canvas.getContext(string contextType) RenderingContext Canvas.getContext(string c…

链表(Linked List)算法的使用场景和使用例子详解

链表(Linked List)是一种常见的数据结构,它由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。链表算法在软件开发程序中有着广泛的应用场景。 链表算法基础知识: 链表算法基础知识主要包括链表的基本概…

利用 Redis 和 Lua 实现高效的限流功能

简介 在现代系统中,限流是一种重要的机制,用于控制服务端的流量并保护系统免受恶意攻击或请求泛滥的影响。本文将介绍如何利用 Redis 和 Lua 结合实现高效的限流功能。 一、什么是限流 限流指的是对系统中的请求进行控制和调节,确保系统在…

window安装Miniconda的步骤

安装Miniconda是一个简单直接的过程,适合希望在Windows上进行Python开发而又不想安装Anaconda那样庞大软件包的用户。以下是详细的步骤: 第1步:下载Miniconda安装程序 打开你的网络浏览器,访问Miniconda的官方下载页面&#xff…

Cluade3干货:超越GPT,模型特点分析+使用教程|2024年3月更新

就在刚刚,Claude 发布了最新的大模型 Claude3,并且一次性发布了三个模型,分别是 Claude 3 Haiku:(日本俳句 )Claude 3 Sonnet(英文十四行诗)Claude 3 Opus(古典乐作品集…

docker-compose Install rustdesk

RustDesk RustDesk 是一款开源的远程支持和远程桌面工具,它旨在为用户提供便捷的远程协助和远程访问功能。 默认情况下,hbbs 监听21115(tcp), 21116(tcp/udp), 21118(tcp),hbbr 监听21117(tcp), 21119(tcp)。务必在防火墙开启这几个端口, 请注意21116同时要开启TCP和UDP。…

力扣爆刷第86天之hot100五连刷16-20

力扣爆刷第86天之hot100五连刷16-20 文章目录 力扣爆刷第86天之hot100五连刷16-20一、238. 除自身以外数组的乘积二、41. 缺失的第一个正数三、73. 矩阵置零四、54. 螺旋矩阵五、48. 旋转图像 一、238. 除自身以外数组的乘积 题目链接:https://leetcode.cn/problem…

streamlit初学-用streamlit实现云台控制界面

用streamlit实现云台控制界面 效果图PC上的效果手机上的效果 源码: 本文演示了,如何用streamlit做一个云台控制界面。功能包括:用户登录,事件的处理,图片的更新 版本信息: streamlit_authenticator: 下载链接streamlit : 1.31.1python: 3.11 修改点: streamlit_authenticato…

AndroidStudio安装Android模拟器AVD及遇到的问题解决

打开DeiviceManager 创建虚拟机 选个常规的1080*1920分辨率 这里就遇到一个报错: Android SDK is up to date. Running Android Emulator hypervisor driver installer [SC] ControlService 失败 1062: 服务尚未启动。 [SC] DeleteService 成功 [SC] 由于发生错误…