返回

参数传递:值传递 vs 引用传递

前端

值传递

在JavaScript中,当我们把一个变量的值传递给函数时,其实就是把这个变量的值复制一份给函数的形参。这意味着函数内部对形参的任何修改都不会影响到函数外部的实参。

举个例子:

function add(a, b) {
  a = a + 1;
  b = b + 1;
}

let x = 1;
let y = 2;

add(x, y);

console.log(x); // 1
console.log(y); // 2

在这个例子中,函数add()被调用时,参数x和y的值分别被复制给了形参a和b。函数内部对a和b的修改不会影响到函数外部的x和y的值。

引用传递

在JavaScript中,引用传递是指把一个变量的引用传递给函数,而不是把变量的值传递给函数。这意味着函数内部对形参的任何修改都会影响到函数外部的实参。

在JavaScript中,引用传递只对对象有效。当我们把一个对象作为参数传递给函数时,函数内部对这个对象的任何修改都会影响到函数外部的这个对象。

举个例子:

function addProperty(obj) {
  obj.newProperty = 'value';
}

let person = {
  name: 'John',
  age: 30
};

addProperty(person);

console.log(person); // { name: 'John', age: 30, newProperty: 'value' }

在这个例子中,函数addProperty()被调用时,参数obj被赋予了person对象的引用。函数内部对obj的修改也会影响到函数外部的person对象。

值传递和引用传递的区别

值传递和引用传递的区别在于:

  • 值传递:把变量的值复制一份给函数的形参,函数内部对形参的任何修改都不会影响到函数外部的实参。
  • 引用传递:把变量的引用传递给函数,函数内部对形参的任何修改都会影响到函数外部的实参。

何时使用值传递,何时使用引用传递?

在JavaScript中,值传递是默认的传递方式。只有在需要修改函数外部的变量时,才使用引用传递。

一般来说,如果函数只需要使用参数的值,而不需要修改参数的值,那么就应该使用值传递。如果函数需要修改参数的值,那么就应该使用引用传递。

例如,如果我们想创建一个函数来计算两个数的和,那么我们应该使用值传递。因为我们只需要使用这两个数的值,而不需要修改这两个数的值。

function sum(a, b) {
  return a + b;
}

let x = 1;
let y = 2;

let result = sum(x, y);

console.log(result); // 3

在这个例子中,函数sum()被调用时,参数x和y的值分别被复制给了形参a和b。函数内部对a和b的修改不会影响到函数外部的x和y的值。

如果我们想创建一个函数来修改一个对象,那么我们应该使用引用传递。因为我们需要修改这个对象的值。

function addProperty(obj) {
  obj.newProperty = 'value';
}

let person = {
  name: 'John',
  age: 30
};

addProperty(person);

console.log(person); // { name: 'John', age: 30, newProperty: 'value' }

在这个例子中,函数addProperty()被调用时,参数obj被赋予了person对象的引用。函数内部对obj的修改也会影响到函数外部的person对象。

结论

JavaScript中的参数传递有两种方式:值传递和引用传递。值传递是默认的传递方式,只有在需要修改函数外部的变量时,才使用引用传递。