JavaScript 简单类型与复杂类型-复杂类型传参

在JavaScript中,变量根据其存储的数据类型可分为简单类型(基本数据类型)和复杂类型(引用数据类型)。理解这两者在函数调用时的行为差异对于编写高效且无误的代码至关重要。本文将专注于探讨复杂类型的参数传递机制,并通过实例说明这些概念的实际应用。

复杂类型简介

JavaScript中的复杂类型包括:

  • Object
  • Array
  • Function
  • 其他自定义对象

复杂类型的值是按引用传递的,这意味着当一个复杂类型的值作为参数传递给函数时,实际上是创建了一个新的引用,指向同一个堆内存地址。因此,在函数内部对该对象所做的任何修改都会反映到原始对象上。

参数传递机制

按引用传递

按引用传递意味着函数接收的是实际对象的一个引用。如果在函数内部修改了该对象的内容,这种修改会影响到外部的原始对象。

示例1:对象参数传递
function modifyObject(obj) {obj.name = "World";
}let person = { name: "Hello" };
modifyObject(person);
console.log(person.name); // 输出: World

在这个例子中,person对象被传递给modifyObject函数。虽然我们并没有直接返回修改后的对象,但由于按引用传递的特性,函数内部对obj的修改直接影响到了外部的person对象。

示例2:数组参数传递
function updateArray(arr) {arr.push(4);
}let numbers = [1, 2, 3];
updateArray(numbers);
console.log(numbers); // 输出: [1, 2, 3, 4]

同样地,当我们向函数传递一个数组时,函数内部对该数组的任何修改都会影响到原始数组。

实际应用场景

场景1:对象的状态管理

当你需要在一个函数内部更新对象的状态时,利用复杂类型的引用传递特性是非常有用的。

function addScore(player, points) {player.score += points;
}let player = { name: "Alice", score: 100 };
addScore(player, 50);
console.log(player.score); // 输出: 150

在这个场景中,player对象的状态通过addScore函数得到了更新,这展示了复杂类型在状态管理方面的灵活性。

场景2:数组的操作

处理数组时,经常会遇到需要在函数内部添加、删除或修改元素的情况。复杂类型的引用传递使得这样的操作变得非常直观。

function removeFirstElement(arr) {arr.shift();
}let fruits = ['Apple', 'Banana', 'Cherry'];
removeFirstElement(fruits);
console.log(fruits); // 输出: ['Banana', 'Cherry']

在这个例子中,removeFirstElement函数移除了数组的第一个元素,并且这个改变也反映到了原始数组fruits上。

注意事项

尽管复杂类型是按引用传递的,但需要注意的是,传递的是对象的引用而不是整个对象本身。这意味着如果你尝试重新分配传入的对象,它不会影响到原始对象。

示例3:重新分配对象引用
function replaceObject(obj) {obj = { newName: "New Value" };
}let original = { name: "Original Value" };
replaceObject(original);
console.log(original); // 输出: { name: 'Original Value' }

在这个例子中,即使我们在replaceObject函数内部试图替换obj的值,原始对象original并未受到影响。这是因为函数内部的重新赋值只是改变了局部变量obj的引用,而没有影响到外部对象。

结语

感谢您的阅读!如果你有任何问题或想分享自己的经验,请在评论区留言交流!

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

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

相关文章

L2-043 龙龙送外卖(dfs)

龙龙是“饱了呀”外卖软件的注册骑手,负责送帕特小区的外卖。帕特小区的构造非常特别,都是双向道路且没有构成环 —— 你可以简单地认为小区的路构成了一棵树,根结点是外卖站,树上的结点就是要送餐的地址。 每到中午 12 点&#…

如何基于PyTorch做二次开发

基于PyTorch进行二次开发以实现可视化工程,可以从以下几个方面入手:模型结构可视化、训练过程监控、特征可视化等。以下是一些推荐的GitHub项目,这些项目可以帮助你快速搭建一个可视化的工程环境: ### 1. **PyTorch CNN Visualiz…

本地大模型编程实战(26)用langgraph实现基于SQL数据构建的问答系统(5)

本文将将扩展上一篇文章完成的 langgraph 链,继续使用基于 langgraph 链 ,对结构化数据库 SQlite 进行查询的方法。该系统建立以后,我们不需要掌握专业的 SQL 技能,可以用自然语言询问有关数据库中数据的问题并返回答案。主要完善…

【Kubernetes】污点和容忍

一、概述 在 Kubernetes(k8s)中,污点(Taints) 是定义在节点上的一种机制,用于拒绝某些 Pod 调度到该节点,除非这些 Pod 具有对应的容忍度(Tolerations)。污点可以用来控…

【大模型➕知识图谱】大模型结合医疗知识图谱:解锁智能辅助诊疗系统新范式

【大模型➕知识图谱】大模型结合医疗知识图谱:解锁智能辅助诊疗系统新范式 大模型结合医疗知识图谱:解锁智能辅助诊疗系统新范式引言一、系统架构1.1 系统架构图1.2 架构模块说明1.2.1 用户输入1.2.2 大模型(语义理解与意图识别)1.2.3 Agent(问题解析与任务分配)1.2.4 问…

FASIONAD:自适应反馈的类人自动驾驶中快速和慢速思维融合系统

24年11月来自清华、早稻田大学、明尼苏达大学、多伦多大学、厦门大学马来西亚分校、电子科大(成都)、智平方科技和河南润泰数字科技的论文“FASIONAD : FAst and Slow FusION Thinking Systems for Human-Like Autonomous Driving with Adaptive Feedbac…

【免费】YOLO[笑容]目标检测全过程(yolo环境配置+labelimg数据集标注+目标检测训练测试)

一、yolo环境配置 这篇帖子是我试过的,非常全,很详细【cudaanacondapytorchyolo(ultralytics)】 yolo环境配置 二、labelimg数据集标注 可以参考下面的帖子,不过可能会出现闪退的问题,安装我的流程来吧 2.1 labelimg安装 label…

Linux系统软件管理

systemctl 控制软件启动和关闭 Linux系统很多软件支持使用systemctl命令控制:启动,停止,开启自启。 能被systemctl管理的软件,一般被称为:服务。 语法:systemctl start|stop|status|enable|disable 服务名…

CAN总线通信协议学习1——物理层

首先来看看CAN是怎么产生的:简单理解,CAN就是一种“拥有特别连接方式”的数据传输的总线,其有特定的一些规则。 (注:资料及图片来源于知乎博主TOMOCAT。) CAN总线的结构 查阅参考文献,OSI标准…

偏移量是什么

在将二维网格映射到一维数组时,偏移量是指在一维数组中 某一行的第一个元素相对于数组起始位置的位置差。对于一个 3 行 4 列的网格,我们使用公式 cur_pos x * n y 来计算二维位置 (x, y) 在一维数组中的索引。 当 x 0 (第一行&#xff…

【Mac电脑本地部署Deepseek-r1:详细教程与Openwebui配置指南】

文章目录 前言电脑配置:安装的Deepseek版本:使用的UI框架:体验效果展示:本地部署体验总结 部署过程Ollama部署拉取模型运行模型Openwebui部署运行Ollama服务在Openwebui中配置ollama的服务 后话 前言 deepseek最近火的一塌糊涂&a…

给小白的oracle优化工具,了解一下

有时懒得分析或语句太长,可以尝试用oracle的dbms_sqldiag包进行sql优化, --How To Use DBMS_SQLDIAG To Diagnose Query Performance Issues (Doc ID 1386802.1) --诊断SQL 性能 SET ECHO ON SET LINESIZE 132 SET PAGESIZE 999 SET LONG 999999 SET SER…

YOLO11改进加入ResNet网络

文章目录 1.改进目的2.demo引入2.1代码2.2 结果展示2.3 BottleNeck详解 1.改进目的 原始YOLO11模型训练好以后,检测结果mAP结果很低,视频检测结果很差,于是想到改进网络,这里介绍改进主干网络。 2.demo引入 2.1代码 # File: 2…

Spring MVC流程

SpringMVC启动流程 启动流程父子容器请求处理MultipartFile 解析参数传递返回值处理HandlerInterceptor 启动流程 启动Tomcat解析web.xml创建DispatcherServlet调用DIspatcherServlet的init方法 4.1 创建Spring容器 4.2 发布ContextRefresheEvent 4.3 在OnRefreshed方法中触发…

【大数据】ClickHouse常见的错误及解决方式

ClickHouse 是一款高性能的列式数据库,但在使用过程中难免会遇到一些错误。本文将介绍一些 ClickHouse 常见的错误及其解决方式,帮助您更好地使用 ClickHouse。 1、错误:DB::Exception 错误信息 DB::Exception:Table engine Distributed d…

物理竞赛中的线性代数

线性代数 1 行列式 1.1 n n n 阶行列式 定义 1.1.1:称以下的式子为一个 n n n 阶行列式: ∣ A ∣ ∣ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 a n 2 ⋯ a n n ∣ \begin{vmatrix}\mathbf A\end{vmatrix} \begin{vmatrix} a_{11…

IP-----动态路由OSPF

这只是IP的其中一块内容,IP还有更多内容可以查看IP专栏,前一章内容为GRE和MGRE ,可通过以下路径查看IP-------GRE和MGRE-CSDN博客,欢迎指正 注意!!!本部分内容较多所以分成了两部分在下一章 5.动态路由OS…

数字内容体验未来趋势:交互升级与用户深耕

智能技术重塑内容交互 随着数字内容体验进入深度智能化阶段,AI驱动的内容生成与智能推荐算法正在重构用户与信息的交互范式。基于自然语言处理技术的内容创作工具,已实现从文本自动生成到多模态内容适配的跨越,企业能够以分钟级速度产出符合…

2025年2月21日优雅草内测分发站全新升级-测试运营-优雅草内测分发站新用户提供免费100下载点-2月28日正式运营并且提供私有化部署版本

2025年2月21日优雅草内测分发站全新升级-测试运营-优雅草内测分发站新用户提供免费100下载点-2月28日正式运营并且提供私有化部署版本 说明 优雅草内测分发站新用户提供免费100下载点,优雅草分运营站和demo测试站 运营站:www.youyacao.cn 提供免费100…

动态内存池设计与环形缓冲区实现详解

一、动态内存池设计 在嵌入式系统中,频繁使用 malloc 和 free 会导致内存碎片和性能问题。动态内存池通过预分配固定大小的内存块,并统一管理分配与释放,显著提高内存使用效率和实时性。 1. 核心设计思路 预分配内存:将内存划分…