本文详细解析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参数相关内容,请检索本站往期文章或继续阅读下文,感谢支持!