在函数内修改形参的值,不会导致实参的值发生改变,但可能会导致实参指向的对象发生改变

在函数内修改形参的值,不会导致实参的值发生改变,但可能会导致实参指向的对象发生改变

在JavaScript中,参数传递是按值传递的,但这个“值”对于对象类型来说是一个引用(即对象在内存中的地址)。因此,当你在函数内修改形参的值时,对于基本类型(如字符串、数字、布尔值等),实参的值不会改变;而对于对象类型,虽然实参的引用值不会改变,但实参指向的对象内容可能会改变。

基本类型参数

function changePrimitive(value) {
  value = 100; // 修改形参的值
}

let num = 10;
changePrimitive(num);
console.log(num); // 输出: 10,实参的值没有改变

在这个例子中,num 是一个基本类型(数字),当我们调用 changePrimitive 函数并传入 num 时,函数内部对 value 的修改并不会影响到外部的 num

对象类型参数

function changeObject(obj) {
  obj.property = "new value"; // 修改形参指向的对象的属性
}

let myObject = { property: "original value" };
changeObject(myObject);
console.log(myObject.property); // 输出: "new value",实参指向的对象内容发生了改变

在这个例子中,myObject 是一个对象。当我们调用 changeObject 函数并传入 myObject 时,函数内部对 obj 的属性 property 的修改会影响到外部的 myObject,因为 objmyObject 指向的是同一个对象。

对象引用的重新赋值

function reassignObject(obj) {
  obj = { newProperty: "new value" }; // 重新赋值形参,使其指向新的对象
}

let anotherObject = { property: "original value" };
reassignObject(anotherObject);
console.log(anotherObject.property); // 输出: "original value",实参的引用值没有改变

在这个例子中,尽管我们在函数内部对 obj 进行了重新赋值,使其指向了一个新的对象,但这个改变并不会影响到外部的 anotherObject。因为重新赋值只是改变了 obj 的引用值,而 anotherObject引用值保持不变,它仍然指向原来的对象。

基于 Commit Hash 的 Git 分支管理实战指南 2026-01-27

评论区