JavaScript中的参数传递与引用类型
Howard 4/24/2021 Javascript
在 JavaScript 中,关于参数传递和引用类型的理解确实经常引发混淆。让我们一起来分析一下示例代码,并深入探讨 JavaScript 中参数传递的工作原理以及引用类型的处理方式。
# 示例代码分析
首先,让我们来看一下示例代码:
function test(person) {
person.age = 26;
person = {
name: 'hzj',
age: 18,
};
return person;
}
const p1 = {
name: 'fyq',
age: 19,
};
const p2 = test(p1);
console.log(p1); // -> ?
console.log(p2); // -> ?
在这段代码中,定义了一个名为 test
的函数,该函数接受一个参数 person
。在函数内部,首先修改了传入的 person
对象的 age
属性,然后又重新为 person
赋值一个新的对象。接着,调用了 test
函数,传入了一个名为 p1
的对象,并将函数返回值赋给了 p2
。最后,使用 console.log
分别输出了 p1
和 p2
。
# 参数传递与引用传递
在 JavaScript 中,参数传递确实是通过值传递的。对于基本数据类型(例如数字、字符串、布尔值等),传递的是其值的副本。但是,对于引用类型(例如对象和数组),传递的是其引用的副本。
在函数 test
中,首先修改了传入的 person
对象的 age
属性,这是因为修改的是引用对象的属性,而不是改变引用本身。接着,为 person
赋值了一个新的对象,这是在函数内部创建的局部变量,并不会影响到函数外部的引用。
# 结果解释
根据上述分析,我们可以得出以下结论:
console.log(p1);
将输出{ name: 'fyq', age: 26 }
。因为在函数内部,修改了传入的person
对象的age
属性,这是引用对象的属性修改,所以p1
的age
属性也被修改为了 26。console.log(p2);
将输出{ name: 'hzj', age: 18 }
。因为函数返回了一个新的对象{ name: 'hzj', age: 18 }
,并且这个新对象被赋值给了p2
。
在总结中,尽管 JavaScript 中的参数传递是通过值传递的,但对于引用类型,传递的是引用的副本,从而允许在函数内部修改引用对象的属性。