原始类型赋值是传值调用,因为其在栈中直接存储值,赋值时复制的是值本身而非地址,故变量间完全独立、互不影响,且无堆内存分配与引用机制。

原始类型赋值是传值调用。
为什么说是“传值”,不是“传引用”
原始类型(如 number、string、boolean、null、undefined、symbol、bigint)在赋值时,JavaScript 直接把栈中存储的值复制一份给新变量。这个过程不涉及地址、指针或共享内存——两个变量完全独立,互不影响。
- let a = 42; let b = a; → b 得到的是 42 这个值的副本,不是 a 的地址
- b = 99; 不会改变 a,a 仍为 42
- 即使在函数参数中传入原始类型,也是复制该值,函数内修改形参不会影响外部实参
不存在“传引用”的可能性
原始类型没有内存地址可供引用——它们本身就在栈中,且不可变(immutable)。你不能“修改”一个数字 42 的内部状态,只能让变量指向另一个新值。因此,语言层面根本不会产生引用传递所需的“地址拷贝”行为。
- 没有堆内存分配,不生成对象实例
- 没有引用计数、GC 跟踪或地址别名问题
- 所有操作(赋值、传参、解构)天然就是值的完整复制
和引用类型的对比很清晰
引用类型(object、array、function 等)赋值时复制的是堆中对象的地址,所以多个变量可能指向同一块数据;而原始类型永远只复制值本身。
- 原始类型:栈中存值 → 赋值 = 复制值
- 引用类型:栈中存地址,堆中存数据 → 赋值 = 复制地址
- 参数传递规则统一:JS 所有参数都是按值传递,只是“值”的内容不同
传值调用对原始类型来说,不是一种“模拟”或“近似”,而是它唯一且本质的行为方式。











