JavaScript 参数传递机制:值传递与共享传递详解

作者:异步漫步时间:2026-10-30 14:08:43浏览:398

本文深入解析 JavaScript 中的参数传递机制。基本类型采用按值传递,修改形参不影响实参;对象类型采用按共享传递(Call by Sharing),即传递引用的副本。通过代码示例说明修改对象属性与重新赋值对原对象的不同影响,澄清按引用传递的常见误区。

值传递与按引用传递的概念

按值传递(call by value)是编程中最常见的求值策略之一。在这种机制下,函数的形参实际上是调用时传入实参的一份副本。因此,在函数内部修改形参的值,不会影响到外部的原始实参。

相比之下,按引用传递(call by reference)允许函数形参直接接收实参的隐式引用,而非副本。这意味着如果修改了形参的值,实参也会随之改变,因为两者指向内存中的同一个值。

然而,按引用传递策略可能导致函数调用追踪变得复杂,有时还会引发一些难以察觉的微妙 Bug。

另一方面,按值传递每次都需要克隆副本,对于复杂数据类型而言,这可能会带来较低的性能开销。两种传值方式各有优劣。

JavaScript 中的基本类型传递

在 JavaScript 中,基本数据类型(如 Number、String、Boolean 等)的传递遵循按值传递的规则。


var a = 1;
function foo(x) {
x = 2;
}
foo(a);
console.log(a); // 仍为1, 未受x = 2赋值所影响

对象类型的共享传递机制

接下来我们考察对象类型的传递行为。


var obj = {x : 1};
function foo(o) {
o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, 被修改了! 
var obj = {x : 1};
function foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x); // 仍然是1, obj并未被修改为100.

通过观察可以发现,对象值的传递并非严格的按引用传递。准确地说,JavaScript 采用了一种称为按共享传递(call by sharing)的策略,有时也被称为按对象传递或按对象共享传递。其中,基本类型按值传递,而对象类型按共享传递。

该策略的核心在于:当调用函数并传入对象实参时,函数接收到的是该对象引用的副本。这既不是按值传递产生的对象副本,也不是按引用传递中的隐式引用。它与按引用传递的关键区别在于:在共享传递中,对函数形参本身进行赋值操作(例如让形参指向新对象),不会影响实参的引用地址。

对象属性修改与整体赋值的区别

总结来说,基本类型是按值传递的。对于对象类型,传入的是指向对象的地址引用,这可以视为一种特殊的按值传递。如果在函数内部修改对象的属性(例如 o.x = 3),实际上是对该引用指向的对象属性进行操作,原对象会发生变化。但是,如果在函数内部对对象整体进行重新赋值(例如 o = 100 或 o = []),这实际上是在函数局部作用域内定义了一个新的局部变量,实参的引用地址并未改变,因此原始对象不会受到整体赋值的影响。

以上是对 JavaScript 参数传递机制的详细解析,涵盖了值传递与共享传递的区别。希望这些信息能帮助您更好地理解 JS 中的变量传递行为。如有任何疑问,欢迎留言交流,我们将及时回复。感谢支持!

作者最新文章