JavaScript函数传参均为按值传递:基本类型复制值,对象类型复制地址副本;浅拷贝复现该机制,仅拷贝第一层值或地址。

JavaScript 中函数传参**没有真正的“按引用传递”**,所谓“对象按引用传递”是一种常见误解。准确来说:所有参数都是按值传递的,但这个“值”对基本类型是数据本身,对对象类型是内存地址(即指向堆中对象的指针副本)。浅拷贝恰好能帮我们看清这个本质区别。
基本类型传参 = 真正的值拷贝
基本类型(number、string、boolean、null、undefined、symbol、bigint)在传参时,会把实际值完整复制一份给形参。形参和实参完全独立,互不影响。
这就像用复印机复印一张纸——你改复印件,原件纹丝不动。
- 实参变量存的是值本身(如 42),直接放在栈中
- 形参拿到的是这个值的全新副本,修改它不会波及外部
- 浅拷贝对基本类型没意义,因为赋值本身就是浅拷贝
对象传参 = 地址副本传递(不是引用本身)
对象(包括数组、函数、Map等)传参时,传的是该对象在堆内存中的地址的一个副本。这个副本和原变量指向同一个对象,所以修改对象属性会影响外部;但若给形参重新赋值(=),只是让副本指向新地址,原变量仍指向旧对象。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
这就像两个人拿着同一把钥匙(地址副本)去开同一扇门(堆中对象)——都能进门改里面的东西;但其中一人换了一把新钥匙(o = {}),并不影响另一个人手里的原钥匙。
- 实参变量存的是地址(如 0x7a1f),形参也拿到一个一模一样的地址值
- 两者通过相同地址访问同一块堆内存,因此 obj.name = 'x' 外部可见
- 但 obj = {a:1} 只改变形参的地址副本,不改变实参的地址
浅拷贝是理解这个机制的“放大镜”
浅拷贝(如 Object.assign({}, obj)、[...arr]、{...obj})只复制第一层属性的值:对基本类型复制值,对嵌套对象只复制其地址。这与函数传参行为高度一致——帮你直观看到“地址副本”的效果。
- 传入一个对象,函数内用浅拷贝生成新对象,新对象与原对象属性值相同,但地址不同 → 修改新对象不影响原对象
- 传入一个含嵌套对象的对象,浅拷贝后修改嵌套对象的属性,原对象也会变 → 因为嵌套对象的地址被复制了
- 这说明:传参时“可修改内容”不等于“可改变绑定”,关键看有没有执行 = 操作
一句话总结区别核心
基本类型传参后,形参和实参是两个独立的值;对象传参后,形参和实参是两个独立的地址副本,指向同一个对象。浅拷贝不是传参方式,而是验证这一机制是否生效的常用手段——它复现了传参时“一层值、多层地址”的行为特征。

















