JavaScript原始类型参数传递是值传递——函数内修改不影响外部变量,因为传入的是独立副本;原始类型不可变,操作均返回新值,而对象传递的是引用地址。

JavaScript 中的原始类型(如 string、number、boolean、undefined、null、symbol 和 bigint)在函数参数传递时,表现的是典型的值传递(pass by value)行为——函数内部对参数的修改不会影响外部变量的值。
原始类型参数是独立副本
当把原始类型的值传入函数时,JS 实际上复制了该值的一个副本,并将副本传给形参。形参和实参在内存中互不关联:
- 函数内重新赋值(如
param = 100)只改变局部变量,不影响调用处的原始变量; - 即使参数名与外部变量同名,它们也指向不同的内存位置;
- 没有引用关系,因此不存在“通过参数修改外部值”的可能。
对比对象类型:突显原始类型的不可变性
原始类型本身是不可变的(immutable),所有操作都返回新值,例如:
-
str.toUpperCase()返回新字符串,原字符串不变; -
num += 1是重新赋值,不是修改原始数字; - 这与对象(如数组、对象字面量)不同——后者传参虽也是值传递,但“值”是引用地址,因此可间接修改原对象属性。
常见误解澄清
有人误以为“JS 全是引用传递”或“只有对象才引用传递”,其实关键在于:传递的永远是值,区别只在于这个“值”是什么:
立即学习“Java免费学习笔记(深入)”;
- 原始类型:值就是数据本身(如
42、"hello"); - 对象类型:值是内存地址(即引用),所以多个变量可指向同一块堆内存。
实际编码建议
理解这一特性有助于写出更可预测的代码:
- 不要指望通过函数参数直接“修改”原始类型外部变量,需显式返回新值并重新赋值;
- 若需多值输出,可用数组或对象包装后返回;
- 在纯函数设计中,原始类型天然支持无副作用,适合做参数和返回值。










