理解JavaScript--传递引用

七、传递引用


1.JavaScript中的基本类型传递

一个我们经常遇到的问题:“JS中的值是按值传递,还是按引用传递呢?”

由于js中存在复杂类型基本类型,对于基本类型而言,是按值传递的.

1
2
3
4
5
6
7
var a = 1;
function test(x) {
x = 10;
console.log(x);
}
test(a); // 10
console.log(a); // 1

虽然在函数testa被修改,并没有有影响到
外部a的值,基本类型是按值传递的.


2.复杂类型按引用传递?

我们将外部a作为一个对象传入test函数.

1
2
3
4
5
6
7
8
9
10
var a = {
a: 1,
b: 2
};
function test(x) {
x.a = 10;
console.log(x);
}
test(a); // { a: 10, b: 2 }
console.log(a); // { a: 10, b: 2 }

可以看到,在函数体内被修改的a对象也同时影响到了外部的a对象,可见复杂类型是按引用传递的.

可是如果再做一个实验:

1
2
3
4
5
6
7
8
9
10
var a = {
a: 1,
b: 2
};
function test(x) {
x = 10;
console.log(x);
}
test(a); // 10
console.log(a); // { a: 1, b: 2 }

外部的a并没有被修改,如果是按引用传递的话,由于共享同一个堆内存,a在外部也会表现为10才对.
此时的复杂类型同时表现出了按值传递按引用传递的特性.


3.按共享传递

复杂类型之所以会产生这种特性,原因就是在传递过程中,对象a先产生了一个副本a,这个副本a并不是深克隆得到的副本a,副本a地址同样指向对象a指向的堆内存.

因此在函数体中修改x=10只是修改了副本a,a对象没有变化.
但是如果修改了x.a=10是修改了两者指向的同一堆内存,此时对象a也会受到影响.

有人讲这种特性叫做传递引用,也有一种说法叫做按共享传递.

-------------本文结束感谢您的阅读-------------
显示 Gitment 评论