JS 深克隆和浅克隆 浅析

        深克隆(Deep Clone)和浅克隆(Shallow Clone)是在复制对象或数组时常用的两种概念。它们主要区别在于复制的深

深克隆(Deep Clone):

        深克隆是指完全复制一个对象或数组,包括对象或数组中的所有嵌套对象或数组。在深克隆中,复制的结果是一个全新的对象或数组,与原始对象或数组完全独立,修改复制后的对象或数组不会影响原始对象或数组。深克隆会递归复制所有嵌套的对象或数组,确保每个对象或数组都是独立的。

浅克隆(Shallow Clone):

        浅克隆是指复制一个对象或数组,但只复制对象或数组的第一层结构,而不会复制嵌套的对象或数组。在浅克隆中,复制的结果仅包含原始对象或数组的引用,而不是深层的复制。因此,修改复制后的对象或数组的第一层结构可能会影响原始对象或数组。

        总结起来,深克隆会复制对象或数组的所有层级,确保每个对象或数组都是独立的,而浅克隆只会复制第一层结构,复制的结果包含原始对象或数组的引用。

深克隆方法:

  • 利用JSON序列化和反序列化
const originalArray = [1, 2, [3, 4]];
const deepCloneArray = JSON.parse(JSON.stringify(originalArray));originalArray[2][0] = 300; // 修改原数组的第三个元素中的第一个元素console.log(originalArray); // [1, 2, [300, 4]]
console.log(deepCloneArray); // [1, 2, [3, 4]],不受原数组修改的影响
  • 使用递归
function deepCloneArray(arr) {let clone = [];arr.forEach(item => {if (Array.isArray(item)) {clone.push(deepCloneArray(item));} else {clone.push(item);}});return clone;
}const originalArray = [1, 2, [3, 4]];
const deepCloneArray = deepCloneArray(originalArray);originalArray[2][0] = 300; // 修改原数组的第三个元素中的第一个元素console.log(originalArray); // [1, 2, [300, 4]]
console.log(deepCloneArray); // [1, 2, [3, 4]],不受原数组修改的影响
  • 使用Lodash库
const _ = require('lodash');
const deepClone = (arr) => {return _.cloneDeep(arr);
}
  • 使用Map函数
function deepCloneArray(array) {return array.map(item => {if (Array.isArray(item)) {return deepCloneArray(item); // 递归调用深克隆函数} else if (typeof item === 'object' && item !== null) {return deepCloneObject(item); // 递归调用深克隆函数} else {return item; // 基本数据类型直接返回}});
}function deepCloneObject(obj) {let clonedObj = {};for (let key in obj) {if (Array.isArray(obj[key])) {clonedObj[key] = deepCloneArray(obj[key]); // 对数组进行深克隆} else if (typeof obj[key] === 'object' && obj[key] !== null) {clonedObj[key] = deepCloneObject(obj[key]); // 对对象进行深克隆} else {clonedObj[key] = obj[key]; // 基本数据类型直接复制}}return clonedObj;
}// 示例
const originalArray = [1, 2, [3, 4], {a: 5, b: [6, 7]}];
const clonedArray = deepCloneArray(originalArray);console.log(originalArray); // 原始数组
console.log(clonedArray); // 深克隆后的数组

浅克隆方法:

  • 直接赋值
  • 使用slice()方法
const originalArray = [1, 2, [3, 4]];
const shallowCloneArray = originalArray.slice();originalArray[2][0] = 300; // 修改原数组的第三个元素中的第一个元素console.log(originalArray); // [1, 2, [300, 4]]
console.log(shallowCloneArray); // [1, 2, [300, 4]],受原数组修改的影响
  • 使用concat()方法
const originalArray = [1, 2, [3, 4]];
const shallowCloneArray = originalArray.concat();originalArray[2][0] = 300; // 修改原数组的第三个元素中的第一个元素console.log(originalArray); // [1, 2, [300, 4]]
console.log(shallowCloneArray); // [1, 2, [300, 4]],受原数组修改的影响
  • 使用扩展操作符
const shallowClone = (arr) => {return [...arr];
}
  • 使用Array.from方法
const shallowClone = (arr) => {return Array.from(arr);
}
  • 使用Object.assign()方法
const shallowClone = (arr) => {return Object.assign([], arr);
}

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

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

相关文章

【前端素材】bootstrap5实现房产信息网HomeFi平台(附源码)

一、需求分析 房产信息网是一个在线平台,专门提供房地产相关信息的网站。这些网站通常为买家、卖家、租客、房地产经纪人等提供各种房产信息,包括可售房屋、出租房源、房价走势、地产市场分析、房产投资建议等内容。以下是房产信息网的主要功能和特点: 房源信息浏览:用户可…

Failed to load resource: net::ERR_FILE_NOT_FOUND问题解决

publicPath是告诉 webpack 打包后的文件在浏览器中的访问路径。当你设置 publicPath: ./ 时,实际上是将构建后的资源相对于当前路径进行引用。 相对路径引用: 默认情况下,Vue CLI 生成的项目会把所有静态资源引用路径设置为绝对路径&#xff…

【lesson60】网络基础

文章目录 网络发展认识协议网络协议初识OSI七层模型TCP/IP五层(或四层)模型网络传输基本流程数据包封装和分用网络中的地址管理 网络发展 以前没有网络剧的工作模式是:独立模式:,计算机之间相互独立 所以多个计算机要协同开发比较难。 有了网络以后&am…

6.s081 学习实验记录(九)lock parallelism

文章目录 一、Memory allocator简介提示实验代码实验结果 二、Buffer cache简介提示实验代码实验结果 该实验将重构某些代码以提高并发度。 首先切换到lock分支: git fetchgit checkout lockmake clean 一、Memory allocator 简介 user/kalloctest 这个程序会对…

关于投资,房地产,AI

各位朋友,新年好! 过个年,世界发生了很多大事! 投资 先是证监会,证监会年前换帅,吴清接棒,吴清何许人也?江湖人称“券商屠夫”,成功处置了2008年的券商风险&#xff0…

Eclipse - Format Comment

Eclipse - Format & Comment 1. Correct Indentation2. Format3. Toggle Comment4. Add Block Comment5. Remove Block CommentReferences 1. Correct Indentation Ctrl A: 选择全部代码 Ctrl I: 校正缩进 or right-click -> Source -> Correct Indentation 2. F…

QWidget自由绘制曲线

效果图:候补 具体实现(核心代码部分带解释) 项目配置部分: QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = DrawWidget TEMPLATE = appSOURCES += main.cpp\mainwindow.cpp \drawwidget.cppHEADERS += mainwindow.h \drawwidget.hmain.c…

centos8安装docker docker compose

首先,你需要在 CentOS 8 上安装 Docker。以下是安装步骤: 更新你的系统:首先,你需要确保你的系统是最新的。你可以使用以下命令来更新你的系统: sudo dnf update -y安装 Docker:然后,你可以使用…

【开工大吉】推荐4款开源、美观的WPF UI组件库

WPF介绍 WPF 是一个强大的桌面应用程序框架,用于构建具有丰富用户界面的 Windows 应用。它提供了灵活的布局、数据绑定、样式和模板、动画效果等功能,让开发者可以创建出吸引人且交互性强的应用程序。 HandyControl HandyControl是一套WPF控件库&#xf…

安全技术和防火墙

1.安全技术和防火墙 1.1安全技术 入侵检测系统(Intrusion Detection Systems):特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要以提供报警和事后监督为主,提供有针对性的指导措施和安全决…

普中51单片机学习(九)

蜂鸣器 蜂鸣器简介 在单片机应用的设计上,很多方案都会用到蜂鸣器,大部分都是使用蜂鸣器来做提示或报警,比如按键按下、开始工作、工作结束或是故障等等。改变单片机引脚输出波形的频率,就可以调整控制蜂鸣器音调,产…

Python操作Kafka基础教程

01 Python操作Kafka基础教程 创建ZooKeeper容器 docker run -d --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime wurstmeister/zookeeper创建Kafka容器 语法是: docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID0 -e KAFKA_ZOOKE…

世界顶级名校计算机专业,都在用哪些书当教材?(文末送书)

目录 01《深入理解计算机系统》02《算法导论》03《计算机程序的构造和解释》04《数据库系统概念》05《计算机组成与设计:硬件/软件接口》06《离散数学及其应用》07《组合数学》08《斯坦福算法博弈论二十讲》参与规则 清华、北大、MIT、CMU、斯坦福的学霸们在新学期里…

vue常见问题

文章目录 data为什么是一个函数,而不是一个对象?什么情况下可以使用对象?key的作用,为什么不能用Index?render函数,h函数,和template什么关系?vue 是怎么解析template的? template会…

讨好型人格的职业分析,如何改变讨好型人格

一味讨好他人,忽略自己感受,凡事以人为先,忽视自己需求,这就是讨好型人格。 讨好型人格最典型的表现就是非常注重外界的看法,不管做什么事都会小心翼翼,生怕自己所做的事会引发别人的不满。 如果自己哪方…

MAC电脑系统清理空间免费版软件CleanMyMac X2024

大家好,我是那个总是被苹果电脑“内存已满”提示搞得焦头烂额的专业博主。如果你也像我一样,在使用Mac时经常遭遇卡顿、慢吞吞的情况,那么今天的Mac清理空间妙招分享绝对适合你! CleanMyMac X全新版下载如下: https://wm.makedi…

【Redis快速入门】深入解读哨兵模式

个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻‍❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…

分糖果问题(java实现)

一、题目 描述 一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下: 每个孩子不管得分多少,起码分到一个糖果。任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。(若相同则无此限制) 给定一个数组 arr …

odoo16实用功能之作业队列(queue.job)

目录 1、官方文档 2、说明 3、简单的开发手册 1、在 Odoo 代码中定义需要异步处理的方法。 2、在需要调用异步方法的位置,使用 with_delay() 调用该方法。 3、注意事项 1、官方文档 Job Queue .. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! This…

layui-tab加载echarts宽度丢失

主要是设置div的样式为&#xff1a;width:100%;height:100%;display: block; <style>.layui-tab-item{width:100%;height:480px;} </style><div class"layui-tab layui-tab-brief" lay-filter"component-tabs-brief"><ul class"…