ECMAScript中函数传递的参数是object的话,是按值传递还是按引用传递?

魔百和CM211-1刷Armbian全流程:从安卓盒子到Linux服务器的完美变身 本文详细介绍了如何将魔百和CM211-1机顶盒刷入Armbian系统,实现从安卓盒子到Linux服务器的完美变身。涵盖硬件兼容性验证、固件选择、刷机流程、系统优化及常见问题解决,特别适合技术爱好者低成本搭建家庭NAS或开发环境。 阅读详情

ECMAScript中函数传递的参数是object的话,是按值传递还是按引用传递?

之前看书时,有下面2段代码,当时看的时候感觉不甚理解,后来查了很多资料,现在整理了一下,分享出来一起学习。

function setName(obj) {
    obj.name = "Nic";
};
var person = new Object();
setName(person);
alert(person.name); // Nic
function setName(obj) {
    obj.name = "Nic";
    obj = new Object();
    obj.name = "lala";
};
var person = new Object();
setName(person);
alert(person.name); // Nic
ES中包含两种不同数据类型的值:基本类型值和引用类型值。
  • 基本类型值是指简单的数据段,比如:UNdefined、Null、Number、String、Boolean。
  • 而引用类型值指可能由多个值构成的对象。比如Object,Array,Function,Date等,引用类型的值是保存在内存中的变量。引用类型的值是按引用访问的。因为js不允许直接访问内存中的位置(不能直接操作对象的内存空间),在操作对象时,实际是在操作对象的引用而不是实际对象。
不同类型值存储在内存中的不同位置
  • 基本类型值:存储在栈(stack)中,也就是说,它们的值直接存储在变量访问的位置。因为可以操作保存在变量中的实际的值,基本数据类型是按值访问的,而且不能给基本类型的值添加属性和方法,所以这些基本类型占据的空间是固定的,可将他们存储在较小的内存区域 – 栈中。这样存储便于迅速查寻变量的值。
  • 引用类型值:存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存地址。这是因为:引用值是对象,对象的属性和方法可能会发生改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。如下图所示:

image

不同的内存分配机制也带来了不同的访问机制

在javascript中是不允许直接访问保存在堆内存中的对象的,所以在访问一个对象时,首先得到的是这个对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值。而基础类型的值则是可以直接访问到的。

复制变量
  • 基本类型值:如果从一个变量向另一个变量复制基本类型值,会在变量对象上创建一个新值,然后把该值复制到位新变量分配的位置上。此后,这两个变量可以参与任何操作而不会相互影响。
  • 引用类型值:在将一个变量向另一个变量复制引用类型的值时,也会将存储在变量对象中的变量中的值复制一份放到新变量分配的空间中,不同的是,这个值的副本是一个指针,也就是说这两个变量都指向了堆内存中的同一个对象,改变其中一个变量,就会影响另一个变量。如下例所示:
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nic";
alert(boj2.name); // Nic

保存在变量中的对象和保存在堆中的对象之间的关系如下图所示。

image

参数传递

ECMAScript中所有函数的参数都是按值来传递的。把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。基本类型值的传递如同基本类型变量的复制,而引用类型值的传递,则如同引用类型变量的复制一样。但是为什么涉及到基本类型与引用类型的值时仍然有区别呢,就是因为内存分配时的差别。
- 基本类型值:只是把变量里的值传递给参数,之后参数和这个变量互不影响。
- 引用类型值:对象变量它里面的值是这个对象在堆内存中的内存地址,因此它传递的值也就是这个内存地址,这也就是为什么函数内部对这个参数的修改会体现在外部的原因了,因为它们都指向同一个对象呀。

现在可以很清楚的理解最开始的两段代码了!

第一段代码中,person中保存了一个对象的地址,然后将person复制给obj,在函数内部,obj 和 person 指向同一个对象。于是,当在函数内部为obj添加name属性后,函数外部的person也将有所反映。第二段代码中,在函数setName()第一行,为obj添加name属性,此时外部的person也拥有了这个属性,函数第二行代码,将另一个新对象赋值给obj,此时,obj中保存的地址变成了新对象的地址,此时函数内部obj和函数外部的person指向的对象就不一样了,所以最后person.name输出的是NIC。


如有不对之处,请各位指正!谢谢!

参考:
https://www.zhihu.com/question/27114726/answer/35481766
http://www.w3school.com.cn/js/pro_js_value.asp

SAP RAP 里的 EML 全解:从语言定位到事务语义,再到真实案例的落地方式 摘要:EML(Entity Manipulation Language)是ABAP RAP模型的核心组件,作为ABAP的子集用于操作业务对象(BO)。它通过声明式语法(READ/MODIFY/EXECUTE/COMMIT)统一访问BO的行为与数据,并由RAP运行时自动处理校验、锁定、草稿管理等生命周期。EML将业务语义融入代码,确保与Fiori应用共享同一套校验逻辑,并通过FAILED/REPORTED/MAPPED管道传递错误与消息。其事务控制(IN LOCAL MODE与COMMIT ENTITIES) 阅读详情

相关推荐

vivado运行时报错 license文件更新操作

vivado使用:SYNTHESIS->Run Synthesis 时报错 [Common 17-345] A valid license was not found for feature ‘Synthesis’ and/or device ‘xc7vx485t’. Please run the Vivado License Manager for assistance in determiningwhich features and devices are licensed for your sy

qq_44692266的博客 2万+

函数参数传递的两种方式——值传递和引用传递

参考原文详细说明:https://www.cnblogs.com/codingmengmeng/p/5865510.html 一、值传递 值传递包括实实在在的值传递以及指针传递(指针传递参数本质上是值传递的方式,它所传递的是一个地址值),传递的都是实参的一个拷贝。 1、实实在在的“值”传递 #include <iostream> #include <vector>...

Magnum的博客 2万+

YOLOv11火焰识别:从环境搭建到GUI部署的完整工程实践

目标检测是计算机视觉的核心任务之一,它通过定位和分类图像中的物体,为机器赋予“看懂”世界的能力。其原理通常基于深度学习模型,如YOLO系列,通过卷积神经网络提取特征并预测边界框与类别。这项技术的价值在于将算法能力转化为实际生产力,广泛应用于安防监控、工业质检、自动驾驶等场景。在工程实践中,环境配置的稳定性与数据质量往往决定项目成败,而模型部署的易用性直接影响最终用户体验。本文以火焰识别这一具体应用为切入点,详细解析了如何利用YOLOv11完成从零到产品化的全链路流程,其中涉及Conda虚拟环境管理、PyTo

weixin_29483277的博客 236

函数中的参数为object... 和 object[] 的区别

先给出两个示例函数 方法1: public void testobject(object... params){ ///省略此处代码 } 方法2: public void testobject(object[] params){ ///省略此处代码 }   区别: object[]  方式作为参数时在调用此方法时必须传入参数 object...  方式作为参数时在调用...

Ein_Blatt的博客 3244

STM32F103C8T6与OV7670摄像头在TFT屏上的实时数字识别系统实现

本文详细介绍了基于STM32F103C8T6单片机和OV7670摄像头实现实时数字识别系统的全过程。系统通过图像采集、预处理、二值化和模板匹配算法,在TFT屏上实时显示识别结果,并针对资源受限的单片机环境提供了内存与性能优化策略,适用于智能家居、工业仪表读数等低成本嵌入式视觉应用场景。

open4的博客 278

嵌入式开发中SAR与ΔΣ ADC选型指南:从原理到实战应用

模数转换器是嵌入式系统连接模拟世界与数字世界的核心接口,其选型直接决定了数据采集的精度与可靠性。SAR ADC采用逐次逼近原理,如同天平称重,通过二进制搜索快速完成转换,具备高速、多通道轮询的优势,适合电机控制、通信等动态场景。ΔΣ ADC则基于过采样与噪声整形技术,以速度换取精度,通过数字滤波输出高分辨率结果,在传感器测量、音频采集等静态高精度领域表现卓越。理解这两种架构的工作原理差异,是进行嵌入式ADC选型的基础。在实际工程中,需结合信号带宽、多通道切换需求、功耗约束及PCB布局能力进行综合权衡。例如,

weixin_30140399的博客 244

(问题)调用JS函数,传过去的参数为什么变成了[OBJECT]

--页面元素代码 <tr><td><input type="button" name="addElement" onclick="addElement('String','form1','text','string','y','','y')" value="添加String"/></td> 这里错了 var _m

awangwu的博客 8383

特征选择(模型输入参数的分析选择)方法汇总

特征选择是模式识别和机器学习领域的重要研究课题之一。为了提高准确率, 人们往往最大限度地提取特征信息。然而, 过大的特征向量维数不仅导致计算成本的增加, 复杂运算也随之带来分类识别率的下降。因此, 通过合适的特征选择算法, 去除无关特征和冗余特征, 获得有助于分类的最优特征子集, 对提高识别性能和降低计算成本具有重要意义。 特征选择主要有两个功能: 减少特征数量、降维,使模型泛化能力更强,减少过拟合 增强对特征和特征值之间的理解 参考资料: 优快云《几种常用的特征选择方法》 知乎《机器学习中,.

David's Tweet 1万+

js数值为引用类型(object), 传递参数(参数为object)按引用传递,并非书中按值传递

知识: 基本数据类型( Undefined、Null、 Boolean、Number、String);这5类基本数据类型是按值访问,因为可以操作变量中的实际值。 引用数据类型(object);js与其他语言不同,不允许直接访问内存中的位置,也就是说,不能直接操作object的内存空间。在操作object时实际上是在操作object的引用,而不是实际的object。故,引用类型的值是按引用访问的

刘龙的博客 7088

TCP/IP工业通信C#极致实现:工业级TcpClient封装 + 粘包拆包彻底解决 + 高频采集专项优化(完整可投产)

在工业自动化、PLC通信、工业传感器/模块、产线高频数据采集等场景中,TCP/IP是绝对主流的通信方式,相比串口/485,具备传输速率高、距离无限制、布线简单、抗干扰强的优势。但工业TCP通信和普通桌面TCP通信有本质区别,工业场景的核心要求是:✔高可靠:7×24小时不间断运行,断网自动重连、异常自动恢复,绝不崩溃;✔无数据错误:彻底解决「粘包、拆包、半包」问题(工业通信第一大坑,90%的通信异常源于此);✔高频采集优化:支持级别的高频读写PLC/设备,无卡顿、无丢帧、CPU占用极低;✔。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 859

Kappa函数:测量一致性并计算置信区间的R语言包

Kappa函数是一种常用的统计量,用于衡量两个评估者之间的一致性。在R语言中,有一个名为"vcd"的包提供了计算Kappa函数以及相应的置信区间的功能。本文将介绍如何使用"vcd"包来计算Kappa函数的值,并进一步计算置信区间。Kappa函数的值介于-1和1之间,值越接近1表示评估者之间的一致性越高,值越接近-1表示评估者之间的一致性越低,值接近0表示评估者之间的一致性接近于随机。通过以上步骤,我们成功地使用R语言中的"vcd"包计算了Kappa函数的值和置信区间。接下来,我们可以使用"vcd"包中的。

2301_79331230的博客 1875

JavaScript函数的传参

  JavaScript 中的函数传参是按值传递还是按引用传递呢?JavaScript 中的函数传参是按值传递还是按引用传递呢? ECMAScript 中所有函数的参数都是按值传递的。 摘自 JavaScript高级程序设计 下面我们看一段代码 function changeStuff(a, b, c) { a = a * 10; b.item = "ch...

迪迦 • 奥特曼 659

从 VL02N 拣配到 ABAP 自动化,读懂 SD_DELIVERY_UPDATE_PICKING 的位置和风险

文章摘要:SAP SD模块中,SD_DELIVERY_UPDATE_PICKING函数模块用于处理出库交货单的拣配确认,更新交货项目的拣配数量。该函数适用于未启用WM/EWM的传统SD流程,能确保拣配状态与标准交货处理逻辑同步,比直接修改数据库更安全。但在S/4HANA Cloud等新环境中,应优先使用API_OUTBOUND_DELIVERY_SRV等公开发布接口。使用该函数时需注意参数完整性和按交货单整体处理的原则,避免逐项提交导致的数据不一致问题。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 245

JavaScript中的参数传递(求值策略),ECMAScript中所有函数的参数都是按值传递吗(系列八)

本篇文章主要讲的是JavaScript中最正常不过的现象——函数参数传递,本篇文章篇幅不长,但一定能引发属于你自己的思考!

余光的博客 4万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ECMAScript 中所有函数的参数都是按值传递的

ECMAScript 中所有函数的参数都是按值传递的。这意味着函数外的值会被复制到函数内部的参数中,就像从一个变量复制到另一个变量一样。如果是原始值,那么就跟原始值变量的复制一样,如果是引用值,那么就跟引用值变量的复制一样。在按值传递参数时,值会被复制到一个局部变量(即一个命名参数,或者用 ECMAScript 的话说, 就是 arguments 对象中的一个槽位)。

jyn15159的博客 603

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ECMAScript中所有函数的参数都是按值传递的?

JavaScript函数调用传的到底是引用还是值?前言基础类型和引用类型 前言 前段时间翻《JavaScript高级程序设计》,无意间发现了这样的一段描述:JavaScript函数调用传的是值。而作者给出的解释是: var people = new Object(); function setName(data){ data.name = "data"; data = new Object(); data.name = "new Object"; return data; } var result

前端学习笔记 864

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JS参数传递(值传递和引用传递)

前端红宝书第一遍看过去之后,相当多的东西都忘记了,第二遍看的时候,也开始注意到一些细节的东西以及理解不到位的地方。书P66 一个加粗框中写到:ECMAScript中所有参数传递都是值,不可能通过引用传递参数当时看过没有怎么仔细想过,一知半解吧,今天理解的更加深一些。当然也是昨天做了个题目就因为这个掉坑里一时没爬出来!访问变量有按值和按引用两种方式,而参数只能按值传递。一、基本数据类型: Numbe...

weixin_39728230的博客 6万+

关于"ECMAScript中所有函数的参数都是按值传递的"

JS高级程序设计—> 4.1.3中提到: “ECMAScript中所有函数的参数都是按值传递的” 为了证明这个论点,举了一个例子: function setName(obj) { obj.name = "Nicholas"; obj = new Object(); obj.name = "Greg"; } var person = new Object(); setNam...

摇摆小仙的博客 429

《JavaScript高级程序设计》——函数参数按值传递

函数参数按值传递疑惑回顾知识如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 疑惑 在《javascript高级程序设计》中,看到第四章4.1.3传递参数这一节,...

weixin_38040996的博客 475

用ChatGPT零代码搭建营销智能代理的完整实战方案

人工智能与自动化技术的融合,正在重塑企业营销的运作方式。其核心原理在于将大语言模型的语义理解与生成能力,通过工作流编排技术封装为可重复执行的智能代理,从而连接内容生成、数据处理与业务动作。这种技术路径的价值在于:无需编写复杂代码,即可让AI承担重复性工作,实现从需求输入到结果回写的闭环。在营销场景中,无论是社媒内容批量生产、线索自动分群,还是活动策划辅助,此类智能代理都能显著提升团队效率。一套完整的落地路径可基于ChatGPT与零代码自动化平台,构建从表单触发、文案生成到数据落表的最小可行方案,帮助运营与技

weixin_33884611的博客 345

像js函数中传递对象参数

像js函数中传递对象参数

qq_43747091的博客 1656

JS 参数传递到底是值传递还是引用传递?

很多人,包括我,受书本知识消化不彻底的影响,认为 JS 中参数有两种传递方式:数字、字符串等按值传递;数组、对象等按地址(引用)传递。对此种观点,我们要谨慎。 var v1 = [] var v2 = {}; var v3 = {}; function foo(v1, v2, v3) { v1 = [1]; v2 = [2]; v3 = {a:3} } foo(

yy20071313的专栏 4178

关于js中一个对象当做参数传递是按值传递还是按引用传递的个人看法

在《JavaScript高级程序设计》这本书中有这样一段话:有很多开发人员错误的认为:在局部作用域中修改的对象会在全局作用域中反映出来,就说明参数是按引用传递的。换句话说,尼古拉认为当一个对象是当做参数传递时,它是按值传递的。然后他举了个例子来证明这个结论: function setName(obj) { obj.name = "Nicholas"; obj = new...

a512394464的博客 212

JS_理解函数参数按值传递

本文是我基于红宝书《Javascript高级程序设计》中的第四章,4.1.3传递参数小节P70,进一步理解javaSript中函数的参数,当传递的参数是对象时的传递方式。 (结合资料的个人理解,有不正...

weixin_39037804的博客 181

JS函数的按值传递

写在前面:ECMAScript访问变量有按值和按引用2中方式,那函数的传参呢?是按值传递还是按引用传递?之前有专门介绍:javascript中的引用类型 和 普通类型 在向参数传递 基本类型 的值时,被传递的值会被赋给一个局部变量(即命名参数/arguments对象中的一个元素): //demo1: function add(n) { return n += 100;...

个人前端记录 832

函数参数的传递方式

也许大家对于函数的参数都不会太在意,简单来说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。深入研究,你会发现其实没那么简单,这个传参是要分俩种情况(其实这是个错误的说法,ECMAScript中所有函数的参数都是按值传递的——《高程3》原话,之所以这里说俩种,是因为结合引用传参更容易理解)——值传参和引用传参。   值传参针对基本类型,引用传参针对引用类型,传参可以理解为复制变量值。基本类型复制后俩个变量完全独立,之后任何一方改变都不会影响另一方;引用类型复制的是引用(即..

aliven1的博客 1096
下一篇: vue动态数据绑定1--如何监听一个对象的变化
林雨静
博客等级 码龄10年 11粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值