JavaScript中的参数传递与引用类型

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 分别输出了 p1p2

# 参数传递与引用传递

在 JavaScript 中,参数传递确实是通过值传递的。对于基本数据类型(例如数字、字符串、布尔值等),传递的是其值的副本。但是,对于引用类型(例如对象和数组),传递的是其引用的副本。

在函数 test 中,首先修改了传入的 person 对象的 age 属性,这是因为修改的是引用对象的属性,而不是改变引用本身。接着,为 person 赋值了一个新的对象,这是在函数内部创建的局部变量,并不会影响到函数外部的引用。

# 结果解释

根据上述分析,我们可以得出以下结论:

  • console.log(p1); 将输出 { name: 'fyq', age: 26 }。因为在函数内部,修改了传入的 person 对象的 age 属性,这是引用对象的属性修改,所以 p1age 属性也被修改为了 26。
  • console.log(p2); 将输出 { name: 'hzj', age: 18 }。因为函数返回了一个新的对象 { name: 'hzj', age: 18 },并且这个新对象被赋值给了 p2

在总结中,尽管 JavaScript 中的参数传递是通过值传递的,但对于引用类型,传递的是引用的副本,从而允许在函数内部修改引用对象的属性。