深拷贝和浅拷贝的区别,如何实现一个深拷贝

在JavaScript中,数据类型分为基本数据类型和引用数据类型。

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

浅拷贝

浅拷贝,指的是创建新的数据。

如果原始数据的属性是基本类型,那拷贝的就是基本类型的值;如果原始数据的属性是引用类型,那拷贝的就是内存地址。浅拷贝是拷贝一层,引用类型部分共享内存地址。

实现一个浅拷贝功能的函数

function shallowClone(obj) {const newObj = {};for (const key in obj) {if (obj.hasOwnProperty(key)) {newObj[key] = obj[key]}}return newObj
}

在JavaScript中,提供一个浅拷贝的函数:

  • Object.assign()
  • 使用拓展运算符实现复制
  • Array.prototype.slice()和Array.prototype.concat()

Object.assign

var obj = {age: 18,nature: ['smart', 'good'],names: {name1: '11',name2: '222'},love: function () {console.log('33333')}
}
var newObj = Object.assign({}, obj)

slice()

const fxArr = ["One", "Two", "Three"]
const fxArrs = fxArr.slice(0)
fxArrs[1] = "love";
console.log(fxArr) // ["One", "Two", "Three"]
console.log(fxArrs) // ["One", "love", "Three"]

concat()

const fxArr = ["One", "Two", "Three"]
const fxArrs = fxArr.concat()
fxArrs[1] = "love";
console.log(fxArr) // ["One", "Two", "Three"]
console.log(fxArrs) // ["One", "love", "Three"]

使用拓展运算符实现复制

const fxArr = ["One", "Two", "Three"]
const fxArrs = [...fxArr]
fxArrs[1] = "love";
console.log(fxArr) // ["One", "Two", "Three"]
console.log(fxArrs) // ["One", "love", "Three"]

深拷贝

深拷贝是开辟一个新的内存空间,两个对象属性完全相同,但是对应的两个不同地址。修改一个对象的属性,不会影响另一个对象。

常见的深拷贝函数:

  1. _.cloneDeep(),lodash库中的一个函数
  2. JSON.stringify()
  3. 手写循环递归

其中的JSON.stringify()会有一些弊端,它会忽略undefined 、Symbol和函数。

循环递归

function deepClone(obj, hash = new WeakMap()) {if (obj === null) return obj; // 如果是null或者undefined,就不进行遍历if (obj instanceof Date) return new Date(obj);if (obj instanceof RegExp) return new RegExp(obj);if (typeof obj !== "object") return obj;// 普通值或者函数,不需要遍历if (hash.get(obj)) return hash.get(obj);let cloneObj = new obj.constructor();hash.set(obj, cloneObj);for (let key in obj) {if (obj.hasOwnProperty(key)) {cloneObj[key] = deepClone(obj[key], hash);}}return cloneObj;
}

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

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

相关文章

0507华为od二面

只记录自己没回答上的问题 1、ZGC的缺点: 1)只是适用于32位系统 2)最大只是支持4TB内存容量 3)最糟糕的情况下吞吐量会下降15%,这都不是事至于吞吐量,通过扩容分分钟解决 4)分代的原因:不同对象的生命周期不相同,可能会扫描整个堆…

产品推荐 | 基于Xilinx ZYNQ FPGA和ADI ADRV9009的双收双发无线电射频板卡

1、产品概述 基于XC7Z100ADRV9009的双收双发无线电射频板卡是基于Xilinx ZYNQ FPGA和ADI ADRV9009开发的专用功能板卡,用于5G小基站,无线图传,数据收发等领域。 2、板卡原理和功能 板卡使用XC7Z100 作为主处理器,包含Dual ARM C…

宏集PLC+HMI触控一体机助力构建物料自动分拣系统

一、应用背景 随着工业生产和物流领域的快速发展,对仓储、分拣和配送效率以及准确性的需求不断提高。传统的人工分拣已无法满足市场需求,为了实现智能物流,对高性能的物料输送分拣设备需求更为迫切。 二、物料分拣系统介绍 智能化物料分拣系…

B端系统菜单栏中使用阿里图标

B端系统菜单栏中使用阿里图标 1.需求说明 由于组件库自带的图标数量和内容有限,采用丰富多样的阿里图标是不错的选择 2.阿里图标使用 2.1官网 iconfont-阿里巴巴矢量图标库 2.2使用 2.2.1.先根据关键词搜索并选择对应的图标 注意:若只是少量的sv…

【嵌入式——QT】QT集成Ymodem协议使用UDP进行传输

【嵌入式——QT】QT集成Ymodem协议使用UDP进行传输 Ymodem协议帧的数据格式帧头包号校验 通讯过程握手信号起始帧数据帧结束帧代码块 Ymodem命令 QT实现YmodemFileTransmit.hYmodemFileTransmit.cppBootLoader.hBootLoader.cppYmodem协议源码 Ymodem协议 帧的数据格式 帧头、…

Stable Diffusion Ai绘画模型推荐:二次元Coriander_Mix v1大模型推荐

负tag嵌入式:EasyNegative,badhandv4 此模型经测试是写实偏3D的效果 画质灰暗的话请加:VAE840000 或者负tag:(watermark:2),(blurry:2),fat,paintings,sketches,(worst quality:2),(low quality:2),(normal quality:2),((monochrome)), ((grayscale))…

将 Vue、React、Angular、HTML 等一键打包成 macOS 和 Windows 平台客户端应用

应用简介 PPX 基于 pywebview 和 PyInstaller 框架,构建 macOS 和 Windows 平台的客户端。本应用的视图层支持 Vue、React、Angular、HTML 中的任意一种,业务层支持 Python 脚本。考虑到某些生物计算场景数据量大,数据私密,因此将…

数据可视化准备:动态识别echarts的横纵坐标数据字段

前言 继上一篇文章 自动选择图表类型:基于数据特征智能决策 分析了如何根据sql和数据结果判断应该自动使用哪种图表类型,本文继续将图表的x轴和y轴横纵坐标识别出来,基本一个二维数据类普通图表就可以直接输出为echarts参数了。 在数据可视…

NTP卫星授时服务器(GPS北斗授时设备)让自控系统更精准

NTP卫星授时服务器(GPS北斗授时设备)让自控系统更精准 NTP卫星授时服务器(GPS北斗授时设备)让自控系统更精准 工业自动化控制是工业生产基础设施的关键组成部分。 通过计算机和自动化技术在工业生产中的广泛应用,实现工…

leetcode-5. 最长回文子串

题目描述 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例 1: 输入:s "babad" 输出:"bab" 解释:"aba"…

计算机发展史故事【4】

继往与开来 巴贝奇巨星陨落后,世人已逐渐将他淡忘,20 世纪已经来临。计算机的历史等待着,等待着巴贝奇式的人物再世,等待着人类划时代的壮举。 大约在1936 年,美国青年霍德华艾肯(H.Aiken)来哈佛…

javacv实时解析pcm音频流

javacv实时解析pcm音频流 解析代码 try (ByteArrayInputStream inputStream new ByteArrayInputStream(bytes);){FFmpegFrameGrabber grabber new FFmpegFrameGrabber(inputStream);// PCM S16LE 格式grabber.setFormat("s16le");// 采样率grabber.setSampleRate(1…

【PHP】查询Mysql根据GREATEST函数对两个字段的较大值对结果进行排序

目录 一、GREATEST函数简介 二、示例 三、应用场景 四、注意事项 在数据库查询中,我们经常需要根据某个字段的值对结果进行排序。然而,有时我们需要根据两个或多个字段的值进行排序,这时我们可以使用MySQL的GREATEST()函数。GREATEST()函…

phpize +Visual Studio + MSYS2 + bison 草稿记录并未正常完成

phpize Visual Studio MSYS2 bison 先安装 Visual Studio https://visualstudio.microsoft.com/zh-hans/vs/ 在安装过程中,选择安装工作负载。确保选择了 C 工作负载以及适用于 C 开发的相关组件,例如 MSVC v142 - VS 2022 C x64/x86 build tools。 …

QT设计模式:工厂模式

基本概念 工厂模式是一种创建型设计模式,用于将对象的创建逻辑与使用者分离,以实现对象的创建和使用的解耦。工厂模式提供了一个统一的接口来创建对象,而客户端代码只需通过该接口来请求所需的对象,而不需要知道具体的对象创建细…

多个glibc库存在时如何查看ldd调用的哪个

但是发现存在多个版本的glibc版本,需要查看具体的库的信息,和相应的关键函数的信息,但是并不知道具体的libc.so.6的路径信息 rootalg-dev04:~/xingqiao# ldd --version ldd (GNU libc) 2.29 rootalg-dev04:/opt# which ldd /usr/local/bin/…

Exness外汇大陆投资者开户详细流程!

Exness是一家全球领先的外汇和差价合约交易平台,因其高效稳定的服务和多样化的交易工具,受到广大投资者的青睐。然而,由于中国大陆用户无法直接访问Exness官网,想要开户的大陆投资者需要通过特定方式才能完成注册。本文将详细介绍…

[Linux使用] apt dpkg 常用包管理命令

查找头文件信息: sudo apt install apt-file sudo apt-file update apt-file search gst.h 查找库文件位置: whereis gstreamer 查找已安装的库: dpkg -l |grep gstreamer

Rust:文件 launch.json 有什么用?

launch.json 是 Visual Studio Code(VSCode)中的一个配置文件,主要用于配置调试器。当你在 VSCode 中进行代码调试时,launch.json 文件告诉调试器如何启动和配置你的程序。 具体来说,launch.json 文件包含了以下信息&…

PDF批量编辑技巧:高效PDF转txt批量处理,轻松管理大量文档

随着信息技术的飞速发展,文档管理已成为日常工作中不可或缺的一部分。特别是当我们需要处理大量的PDF文件时,如何高效地进行编辑、转换和管理成为了一个重要的问题。本文将介绍一些PDF批量编辑的技巧,特别是如何将PDF批量转换为txt格式&#…