返回

对象传递与引用传递

前端

变量类型:值类型与引用类型

在JavaScript中,变量可以分为两大类:值类型和引用类型。值类型变量直接存储变量的值,而引用类型变量存储的是对内存中对象地址的引用。

值类型

值类型变量直接存储变量的值,因此对值类型变量的任何操作都只影响该变量本身,不会影响其他变量。值类型包括:

  • 数字
  • 字符串
  • 布尔值
  • undefined
  • null
let a = 10;
let b = a;

b++;

console.log(a); // 10
console.log(b); // 11

在上例中,变量ab都是值类型变量。当b被递增时,它只影响b变量本身,不会影响a变量。

引用类型

引用类型变量存储的是对内存中对象地址的引用,因此对引用类型变量的任何操作都会影响该变量所引用的对象。引用类型包括:

  • 对象
  • 数组
  • 函数
let a = { name: 'John Doe' };
let b = a;

b.name = 'Jane Doe';

console.log(a.name); // Jane Doe
console.log(b.name); // Jane Doe

在上例中,变量ab都是引用类型变量。当b.name被修改时,它不仅影响了b变量,也影响了a变量,因为ab都引用了同一个对象。

对象传递与引用传递

在JavaScript中,函数可以接收参数,参数可以是值类型变量,也可以是引用类型变量。当函数接收值类型变量作为参数时,函数内部对该变量的任何操作都只影响该变量本身,不会影响函数外部的变量。当函数接收引用类型变量作为参数时,函数内部对该变量的任何操作都会影响该变量所引用的对象,也会影响函数外部的变量。

值传递

当函数接收值类型变量作为参数时,函数内部对该变量的任何操作都只影响该变量本身,不会影响函数外部的变量。这是因为值类型变量直接存储变量的值,因此对值类型变量的任何操作都只影响该变量本身。

function add(a, b) {
  a++;
  b++;

  console.log(a); // 11
  console.log(b); // 11
}

let x = 10;
let y = 10;

add(x, y);

console.log(x); // 10
console.log(y); // 10

在上例中,函数add()接收两个值类型变量ab作为参数。当ab在函数内部被递增时,它只影响ab变量本身,不会影响函数外部的变量xy

引用传递

当函数接收引用类型变量作为参数时,函数内部对该变量的任何操作都会影响该变量所引用的对象,也会影响函数外部的变量。这是因为引用类型变量存储的是对内存中对象地址的引用,因此对引用类型变量的任何操作都会影响该变量所引用的对象。

function updateName(person) {
  person.name = 'Jane Doe';
}

let person = { name: 'John Doe' };

updateName(person);

console.log(person.name); // Jane Doe

在上例中,函数updateName()接收一个引用类型变量person作为参数。当person.name在函数内部被修改时,它不仅影响了person变量,也影响了函数外部的变量person,因为personperson都引用了同一个对象。

结论

在JavaScript中,变量可以分为值类型变量和引用类型变量。值类型变量直接存储变量的值,而引用类型变量存储的是对内存中对象地址的引用。当函数接收值类型变量作为参数时,函数内部对该变量的任何操作都只影响该变量本身,不会影响函数外部的变量。当函数接收引用类型变量作为参数时,函数内部对该变量的任何操作都会影响该变量所引用的对象,也会影响函数外部的变量。