前端知识笔记(四)———深浅拷贝的区别,如何实现?

简介: 前端知识笔记(四)———深浅拷贝的区别,如何实现?

首先要了解什么是浅拷贝,什么是深拷贝,才能更好的清除他们有什么区别,从而如何实现深浅拷贝


一,什么是浅拷贝?


浅拷贝(shallow copy):指创建一个新的数据结构,该数据结构中的元素值是原始数据结构中元素的副本;只复制指向某个对象的指针,而不复制这个对象本身,新旧对象共享一块内存


二,什么是深拷贝?


深拷贝(deep copy):指创建一个新的数据结构,该数据结构中的所有元素及其嵌套元素都是原始数据结构中元素的副本;复制并创建一个一模一样的对象,不共享内存,修改新对象旧对象不会改变


三,深浅拷贝有什么区别?


深拷贝和浅拷贝的区别在于复制数据结构时是否复制了其中的嵌套对象或数组;

选择深拷贝还是浅拷贝取决于具体的需求,以及对数据结构中嵌套元素的处理方式。在处理较为复杂的数据结构时,特别是涉及到嵌套对象或数组的情况下,深拷贝通常更适合确保数据的独立性和完整性;

上述已分析两者区别。


四,浅拷贝如何实现?


像是一些简单的赋值,那就是浅拷贝,


Object.assign()、展开操作符(spread operator)、Array.slice()等也是浅拷贝实现的方法


实例:

// 原始数组
const originalArray = [1, 2, 3];
// 使用展开操作符进行浅拷贝
const shallowCopy = [...originalArray];
console.log(shallowCopy); // 输出: [1, 2, 3]

在上面的示例中,[...originalArray] 使用了展开操作符来创建了 originalArray 的浅拷贝。浅拷贝后的数组 shallowCopy 中的元素值与原始数组 originalArray 中的元素值相同,但它们是独立的副本,对其中一个进行修改不会影响另一个。


五,如何实现深拷贝?


使用递归遍历原始数据结构,并对其中的对象和数组进行递归复制。另外,也可以使用现成的第三方库,比如 lodash 中的 cloneDeep 方法来实现深拷贝。


实例:

function deepCopy(obj) {
  if (typeof obj !== 'object' || obj === null) {
    // 如果不是对象或者是null,则直接返回
    return obj;
  }
  let copy = Array.isArray(obj) ? [] : {};
  for (let key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      copy[key] = deepCopy(obj[key]);
    }
  }
  return copy;
}
// 原始对象
const originalObject = {
  a: 1,
  b: {
    c: 2,
    d: [3, 4]
  }
};
// 深拷贝
const deepClone = deepCopy(originalObject);
console.log(deepClone);

在上面的示例中,deepCopy 函数通过递归遍历原始对象 obj,并对其中的对象和数组进行递归复制,从而实现了深拷贝。

相关文章
|
2月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
169 2
|
1月前
|
监控 前端开发 JavaScript
前端工程化和传统前端开发的区别是什么?
前端工程化相比传统前端开发,在开发模式、代码组织与管理、构建与部署流程、团队协作、性能优化以及技术选型等方面都有了显著的改进和提升,能够更好地应对现代前端应用开发的复杂性和高要求。
|
2月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
46 0
|
4月前
|
前端开发 UED 开发者
颠覆你的前端知识:防抖与节流的区别及实战解析!
【8月更文挑战第23天】在Web前端开发中,处理用户界面交互产生的事件可能会影响性能。为此,我们有两种优化方法:防抖(debounce)和节流(throttle)。防抖确保函数仅在事件停止触发一段时间后执行一次,适用于如搜索自动补全场景。而节流则确保函数按固定时间间隔执行,不管用户操作频率如何。本篇技术博客将深入解析两者差异并提供示例代码,帮助开发者更好地理解和应用这些技巧以提升应用性能和用户体验。
85 0
|
2月前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
|
2月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
2月前
|
机器学习/深度学习 弹性计算 自然语言处理
前端大模型应用笔记(二):最新llama3.2小参数版本1B的古董机测试 - 支持128K上下文,表现优异,和移动端更配
llama3.1支持128K上下文,6万字+输入,适用于多种场景。模型能力超出预期,但处理中文时需加中英翻译。测试显示,其英文支持较好,中文则需改进。llama3.2 1B参数量小,适合移动端和资源受限环境,可在阿里云2vCPU和4G ECS上运行。
116 1
|
2月前
|
前端开发 算法 测试技术
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT
本文对比测试了通义千文、文心一言、智谱和讯飞等多个国产大模型在处理基础计数问题上的表现,特别是通过链式推理(COT)提示的效果。结果显示,GPTo1-mini、文心一言3.5和讯飞4.0Ultra在首轮测试中表现优秀,而其他模型在COT提示后也能显著提升正确率,唯有讯飞4.0-Lite表现不佳。测试强调了COT在提升模型逻辑推理能力中的重要性,并指出免费版本中智谱GLM较为可靠。
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT
|
3月前
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
|
2月前
|
JavaScript 前端开发 应用服务中间件
Vue开发中,在实现单页面应用(SPA)前端路由时的hash模式和history模式的区别及详细介绍
Vue开发中,在实现单页面应用(SPA)前端路由时的hash模式和history模式的区别及详细介绍
35 0