Typescript interface对象赋值引用还是拷贝的问题

在 TypeScript 中,将一个接口对象赋值给另一个变量时,实际上是传递引用而不是进行数据拷贝。也就是说,两个变量都引用同一个对象,因此对其中一个变量进行修改会影响到另一个变量。

示例

假设我们有一个接口 FontSizeEntity

interface FontSizeEntity {size: number;unit: string;
}const fontSize: FontSizeEntity = {size: 16,unit: 'px'
};// 将 fontSize 赋值给另一个变量
const anotherFontSize = fontSize;console.log(anotherFontSize); // { size: 16, unit: 'px' }// 修改 anotherFontSize 会影响 fontSize,因为它们引用的是同一个对象
anotherFontSize.size = 20;console.log(fontSize); // { size: 20, unit: 'px' }
console.log(anotherFontSize); // { size: 20, unit: 'px' }

解释

  • 传引用: 当我们将 fontSize 赋值给 anotherFontSize 时,anotherFontSize 只是对 fontSize 所引用的同一个对象的引用。因此,对 anotherFontSize 的任何修改都会反映在 fontSize 上,反之亦然。

  • 数据拷贝: 如果你希望创建一个新对象,并且与原对象相互独立,则需要进行数据拷贝。这可以通过对象展开操作符(spread operator)或其他方法来实现。

数据拷贝示例

如果你希望赋值时进行数据拷贝,可以使用对象展开操作符(spread operator):

interface FontSizeEntity {size: number;unit: string;
}const fontSize: FontSizeEntity = {size: 16,unit: 'px'
};// 创建一个新的对象,进行浅拷贝
const anotherFontSize = { ...fontSize };console.log(anotherFontSize); // { size: 16, unit: 'px' }// 修改 anotherFontSize 不会影响 fontSize,因为它们是两个独立的对象
anotherFontSize.size = 20;console.log(fontSize); // { size: 16, unit: 'px' }
console.log(anotherFontSize); // { size: 20, unit: 'px' }

深拷贝

对于嵌套对象的深拷贝,可以使用 JSON.parseJSON.stringify 或者 lodash 库中的 cloneDeep 方法:

import _ from 'lodash';interface FontSizeEntity {size: number;unit: string;details?: {fontWeight: string;};
}const fontSize: FontSizeEntity = {size: 16,unit: 'px',details: {fontWeight: 'bold'}
};// 使用 lodash 的 cloneDeep 方法进行深拷贝
const anotherFontSize = _.cloneDeep(fontSize);console.log(anotherFontSize); // { size: 16, unit: 'px', details: { fontWeight: 'bold' } }// 修改 anotherFontSize 的嵌套属性不会影响 fontSize,因为它们是两个独立的对象
anotherFontSize.details!.fontWeight = 'normal';console.log(fontSize.details); // { fontWeight: 'bold' }
console.log(anotherFontSize.details); // { fontWeight: 'normal' }

总结

  • 传引用: 默认情况下,赋值操作是传递引用。
  • 浅拷贝: 使用对象展开操作符 { ...obj } 可以进行浅拷贝。
  • 深拷贝: 使用 JSON.parse(JSON.stringify(obj))lodashcloneDeep 方法进行深拷贝。

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

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

相关文章

防火墙如何端口映射?

防火墙端口映射(Firewall Port Mapping)是一种网络技术,通过对防火墙配置进行调整,允许外部网络用户访问内部网络中的指定端口。该技术使得外部用户可以通过公共网络访问内部网络中的特定服务或应用程序,从而实现远程访…

难兄难弟——Java中 goto 与 const关键字

目录 简洁版: 详解版: 一:goto 二:const 简洁版: 1: 在Java中,goto也是一个关键字,但是取消了goto的使用,使用循环标记进行代替; 2:在Java中&a…

Microsoft VBA Excel 去重+自动化配对信息

问题场景 A列数据中存在很多特别的情况: 中间分隔符为“/”,但是分隔符前后可能存在空格一个编号可能出现多次,例如示例中6003出现了5次可能为空,虽然节选的这部分没出现这种情况 B和C列数据中,会出现空格。 ABC60…

JavaScript--作用域是什么

作用域是什么 编译原理 在传统的编译语言中,程序中的一段源代码在执行之前会经历三个步骤。成为编译 分词/词法分析 这个过程由字符组成的字符串分解成有意义的代码块,这些代码块成为词法单元。 分词和词法分析之间的主要差异在于词法单元的识别是有…

实战指南:Vue 2基座 + Vue 3 + Vite + TypeScript微前端架构实现动态菜单与登录共享

实战指南:Vue 2基座 Vue 3 Vite TypeScript子应用vue2微前端架构实现动态菜单与登录共享 导读: 在当今的前端开发中,微前端架构已经成为了一种流行的架构模式。本文将介绍如何结合Vue 2基座、Vue 3子应用、Vite构建工具和TypeScript语言…

基于Docker的ROS开发

本文主要介绍如何使用Docker在Windows和Linux环境中部署并使用ROS,通过Docker Container运行ROS,可以方便我们在一个本地环境中运行多个ROS版本。 更多内容,访问专栏目录获取实时更新。 关于ROS的版本 参考ROS1 Distribution Wiki和ROS2 Dis…

nginx源码阅读理解 [持续更新,建议关注]

文章目录 前述一、nginx 进程模型基本流程二、源码里的小点1.对字符串操作都进行了原生实现2.配置文件解析也是原生实现待续 前述 通过对 nginx 的了解和代码简单阅读,发现这个C代码的中间件确实存在过人之处,使用场景特别多,插件模块很丰富…

10款AI工具,让工作生活学习更高效

我看大家都推荐的差不多了,常见好用的PC软件就那些,我不想反复“咀嚼”了,我想另辟蹊径推荐点不一样的,比如10款PC端的AI网站。AI已经全方位“侵入”我们的生活,从AI写作到AI绘画,从AI视频到AI语音&#xf…

ROS 节点node和包package

ROS 节点Node和包package node:ros中最基本的程序单元 package:节点的组织形式 节点Node 在 ROS(Robot Operating System)中,节点(Node)是一个运行中的进程,它是 ROS 应用程序的…

【申博分享】对自己过去一年申博的总结

大约是在23年春节后的时候有了读博的想法,到今天刚好一年多一点,之所以申博受多方面因素影响吧,同时自己也没觉得读博很难怎么样的,也还年轻感觉还学得动,唯一难受的就是读博时间成本太高,综合考虑之下还是…

华纳云:怎么限制docker容器的资源使用量?

限制Docker容器的资源使用量可以通过设置容器的资源限制参数来实现。以下是一些常用的资源限制方法: 1. CPU资源限制 通过--cpu参数可以限制容器对CPU的使用量。可以指定容器可以使用的CPU核心数,或者指定CPU配额和周期(quota and period)来限制CPU使用…

Thingsboard规则链:Switch节点详解

在物联网(IoT)领域,数据的高效处理与自动化决策是构建智能系统的核心。作为一款强大的物联网平台,Thingsboard通过其规则引擎为开发者提供了高度灵活的工具,其中Switch节点是实现消息条件路由的关键组件。本文将全方位…

【深度学习】Transformer梳理

零、前言 对于transformer,网上的教程使用记号、术语不一 。 最关键的一点,网上各种图的简化程度不一 (画个图怎么能这么偷懒) ,所以我打算自己手画一次图。 看到的最和善(但是不是那么靠谱,我…

Rust语言实现的去中心化AI网络节点

一、概述 去中心化和人工智能(AI)是两个极具潜力的发展方向。Gaia项目正是将这两者结合起来,创造了一个去中心化的AI网络节点。本文将深入探讨Gaia项目的技术细节,通过丰富的示例和详细描述,帮助读者全面理解并掌握该…

SRS Simple-RTMP-Server 全面介绍、教程与指南

本文全面介绍了SRS(Simple Real-Time Media Server)的功能、技术细节、安装部署、使用方法以及社区支持。涵盖了SRS的多种协议支持、性能优化、高级功能配置,以及如何在不同操作系统上搭建和使用SRS服务器。 文章目录 SRS简介SRS的定义和功能…

黑龙江某市数字孪生地下水监测系统平台项目建设经验

项目背景 地下水是一种特殊而珍贵的资源,它具有不可替代性,与经济发展及人民生活息息相关,针对日趋严峻的水资源危机,如何合理利用有限的水资源,保障国民经济的可持续发展是一个迫切需要解决的问题。 黑龙江某市积极…

eclipse启动时间过长的问题

项目场景: 由于我用eclipse比较习惯,虽然IDEA很好,但是因为收费,所以在个人开发学习过程中一直还是使用eclipse,本文不讨论eclipse与IDEA孰优孰劣问题。 开发环境: 操作系统:Windows 11 22631…

代码随想录 day21

二叉搜索树 二叉搜索树的最小绝对差 题意:求树中任意两不同节点值之间的最小差值 。 思路:这回要使用前后指针了。 使用两个指针(前指针和后指针),对指向的结点的值进行相减,如果值大于maxlen就更新这个值…

【小呆的力学笔记】连续介质力学的知识点回顾一:运动和变形

文章目录 1. 运动的描述2. 拉格朗日描述下的变形2.1 线元的变化2.2 体元的变化2.3 面元的变化 1. 运动的描述 在连续介质力学中,存在着两种对运动的描述,一种为拉格朗日描述,即通过描述每个物质点的运动来描述整个变形体的运动,也…

如何将音频中的人声分离出来?

想要把一段视频中的人声跟背景音乐分离开来,找个好一点的音频处理软件就能把声音分离了,常见的有以下方法,一起来看看吧。 pr 打开软件,然后将电脑上的音频文件,上传到软件中,然后按住[ctrla]选择所有音频…