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

作者:异步漫步

时间:2026-10-30

浏览:518

本文详细解析JavaScript中的参数传递机制,澄清按值传递、引用传递及共享传递的概念。通过代码示例说明原始值与对象在函数调用中的行为差异,重点解释为何重新赋值不影响原对象,而修改属性会生效,帮助开发者准确掌握JS内存模型与变量绑定规则。

文章目录

JavaScript中,参数传递机制通常分为按值传递与按引用传递两类。本文针对特定疑问展开探讨。

const obj = {
  value: 1
};
function foo(o) {
  o = 2;
  console.log(o); //2
}
foo(obj);
console.log(obj.value); // 1
console.log(obj); // { value: 1 }

为何对象obj的值未发生变化?若遵循引用传递逻辑,末行输出应非2,而是{ value: 1 }。

此现象初看令人困惑。鉴于近期频繁接触iOS开发,依据OC语言逻辑:若将引用类型B赋值给引用类型A,则A与B共享同一内存地址,原A实例失效。依此逻辑,输出应为2。然而,JS并非OC,经思考后,简要阐述JS参数传递机制。

按值传递

此为最基础且符合直觉的传递方式。通过代码示例即可理解,即便无JS或编程经验者亦能掌握。

function add(param){
  param+=10;
  console.log(param);//11
}
const num = 1;
add(num);
console.log(num);//1

此处,参数param的修改对num无影响。因num的值被复制至函数add内的局部变量param,故修改param不影响外部num。

引用类型

红宝书对引用类型的定义如下:

ECMAScript所有函数参数均按值传递。即函数外部的值被复制至函数内部参数中,如同变量间复制。若为原始值,复制行为同原始值变量;若为引用值,复制行为同引用值变量。

直接展示代码:

const value = {
  value: 1
};
function fun(o) {
  o.value = 2;
  console.log(o.value);//2
  console.log(o);//{value: 2}
}
fun(value);
console.log(value);//{value: 2}
console.log(value.value);//2

函数内部对形参的操作影响了外部实参,此情形属于引用类型。hba

共享类型

何谓共享类型?

坦白而言,红宝书中未见此表述,但‘坊间’确有关于共享类型的传闻。

沿用前述代码:

const obj = {
  value: 1
};
function foo(o) {
  o = 2;
  console.log(o); //2
}
foo(obj);
console.log(obj.value); // 1
console.log(obj); // { value: 1 }

简言之:若直接修改传入函数参数的对象类型的引用指向,原对象不受影响;若通过拷贝的引用操作内部值,则原对象会被修改。

代码执行的关键在于 o = 2;将原存放参数o的内存地址替换为2(地址更换细节或有差异,但不影响理解)。赋值操作导致标识符重新绑定Rebinding,新标识符指向新内存空间。

至此,关于JavaScript参数传递方式的详解介绍完毕。如需了解更多javascript参数相关内容,请检索本站往期文章或继续阅读下文,感谢支持!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章