javascript函数参数传递分原始类型和引用类型:原始类型栈中存值,传参为值拷贝,互不影响;引用类型栈中存地址,传参为地址拷贝,属性修改共享堆对象,重新赋值则断开连接。

JavaScript 函数参数传递直接影响栈内存的布局方式,而这种影响取决于参数类型——原始类型和引用类型在栈中存放的内容不同,进而决定了函数内操作是否波及外部变量。
原始类型:栈中存值,完全隔离
数字、字符串、布尔值、null、undefined、symbol、bigint 这些原始类型变量,其值直接存储在当前执行上下文的栈帧里。当它们作为参数传入函数时,JS 会在函数的栈帧中为形参新开辟一块空间,并把实参的值完整拷贝过去。
- 两个变量在栈中是物理独立的单元,互不共享内存地址
- 函数内对形参的任何赋值(如 n = 100)或运算(如 n += 1),都只修改局部栈空间里的副本
- 外部变量所在栈位置不受干扰,生命周期和内容均保持不变
引用类型:栈中存地址,共享堆对象
对象、数组、函数等引用类型,变量本身仍存于栈中,但栈里保存的不是数据,而是指向堆内存中实际对象的地址(即指针值)。传参时,这个地址被复制一份到函数栈帧中的形参位置。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 实参和形参在栈中各自拥有一个地址副本,但这两个地址指向堆中同一块对象内存
- 通过形参修改对象属性(如 obj.name = "new")会反映到外部,因为操作的是堆中同一个对象
- 若在函数内给形参重新赋值(如 obj = { name: "other" }),只是让形参指向新地址,不影响实参栈中原来的地址值
内存分配与释放的连带关系
函数调用结束时,其栈帧会被系统自动销毁,其中所有局部变量(包括形参)占用的栈空间一并释放。
- 原始类型形参消失,不影响外部变量——后者仍在自己的栈位置上
- 引用类型形参消失,仅释放栈中的地址副本;堆中的对象是否被回收,取决于是否还有其他变量引用它
- 没有额外堆分配的纯原始类型传参,内存开销极小且可预测
为什么理解这点很实用
看清参数传递背后的内存布局,能帮你避开常见陷阱:
- 不期待函数内改原始参数就能改变外部变量——那是栈隔离的天然结果
- 处理对象时明确区分“改属性”和“换对象”:前者共享,后者断连
- 写纯函数时天然倾向使用原始类型参数,副作用边界清晰
- 调试时若发现对象意外变更,优先检查是否多个栈变量指向了同一堆地址
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










