对象传递与引用传递
2023-11-28 12:35:42
变量类型:值类型与引用类型
在JavaScript中,变量可以分为两大类:值类型和引用类型。值类型变量直接存储变量的值,而引用类型变量存储的是对内存中对象地址的引用。
值类型
值类型变量直接存储变量的值,因此对值类型变量的任何操作都只影响该变量本身,不会影响其他变量。值类型包括:
- 数字
- 字符串
- 布尔值
- undefined
- null
let a = 10;
let b = a;
b++;
console.log(a); // 10
console.log(b); // 11
在上例中,变量a
和b
都是值类型变量。当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
在上例中,变量a
和b
都是引用类型变量。当b.name
被修改时,它不仅影响了b
变量,也影响了a
变量,因为a
和b
都引用了同一个对象。
对象传递与引用传递
在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()
接收两个值类型变量a
和b
作为参数。当a
和b
在函数内部被递增时,它只影响a
和b
变量本身,不会影响函数外部的变量x
和y
。
引用传递
当函数接收引用类型变量作为参数时,函数内部对该变量的任何操作都会影响该变量所引用的对象,也会影响函数外部的变量。这是因为引用类型变量存储的是对内存中对象地址的引用,因此对引用类型变量的任何操作都会影响该变量所引用的对象。
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
,因为person
和person
都引用了同一个对象。
结论
在JavaScript中,变量可以分为值类型变量和引用类型变量。值类型变量直接存储变量的值,而引用类型变量存储的是对内存中对象地址的引用。当函数接收值类型变量作为参数时,函数内部对该变量的任何操作都只影响该变量本身,不会影响函数外部的变量。当函数接收引用类型变量作为参数时,函数内部对该变量的任何操作都会影响该变量所引用的对象,也会影响函数外部的变量。