JavaScript原始类型传参是值传递,即复制数据本身而非地址;函数内修改形参不影响实参,因栈中变量物理独立、不可变,需通过return显式更新外部变量。

JavaScript 中原始类型值的传值调用机制,本质是复制数据本身——不是地址、不是指针、更不是共享变量。你传进去的,就是一个完完全全独立的新副本。
原始类型传参就是复制一份值
当你把 number、string、boolean、null、undefined、symbol 或 bigint 传进函数,JS 在栈内存中为形参新开一块空间,把实参的值原样拷贝过去。
-
let a = 42; function f(n) { n = 100; } f(a);→ 调用后a还是42 -
n += 1、n.toUpperCase()这类操作,都只作用于副本,不影响外部变量 - 栈中每个原始变量都是物理独立的存储单元,没有引用计数,也不参与垃圾回收
和对象传参的区别不在“传什么”,而在“传的是什么值”
JS 所有参数都是按值传递,差别只在于这个“值”的内容:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 原始类型传的“值”是数据本身(比如
42或"hello") - 对象传的“值”是内存地址(即指向堆中对象的引用)
- 所以对象能通过
obj.prop = xxx改变外部状态,原始类型做不到——它连“内部状态”都没有,因为不可变
常见误操作与正确写法
很多人以为能在函数里直接改参数来影响外部变量,结果发现没用。这不是 bug,而是机制设计如此。
立即学习“Java免费学习笔记(深入)”;
- ❌ 错误:试图在函数内赋值改变原始参数:
function double(x) { x *= 2; },然后指望double(num)修改num - ✅ 正确:返回新值,由调用方显式赋值:
function double(x) { return x * 2; },再写num = double(num); - 需要多个输出?用数组或对象包装:
return { a: newA, b: newB };
底层很干净:栈存值,不共享,不联动
原始类型变量直接存在执行上下文的栈帧中,没有间接寻址,没有指针跳转。
- 赋值、传参、解构——全是值的完整复制
- 没有堆内存分配,不生成对象实例
- 这种简单性,正是原始类型行为可预测、副作用可控的根本原因

















