通常对于我们开发者来说,有不少人是忽略了这些小问题的,但是我们又必要去了解.因为今天一个朋友问起,所以写到这里来了,

在C#中,我们知道如果要往一个函数中传递参数的类型为对象,数组或者其他引用类型时.

实际上传递过去的是对象的地址.

那么在javascript中,是否会有什么差异呢?下面我们需要通过例子来证明.

var par1 = 1; //数字(值类型)
var par2 = []; //数组(引用类型)
var par3 = {}; //对象(引用类型) function Test(par1, par2, par3) {
par1 = 3;
par2 = [1, 2, 3];
par3 = {a:1};
} Test(par1, par2, par3); alert(par1);//输出1
alert(par2);//输出空白
alert(par3.a);//输出undefined

上面这段代码我们首先分别定义了值类型par1, 引用类型par2,par3,并传入到Test函数中.

但是par2,par3输出的仍然是之前的数据.

是不是说如果在调用函数时传入引用类型,其实也是传递值呢? 其实不是的.

数组、对象等引用类型也是按值传递,但是这里的值是指变量地址的值

前面的例子中,当我们将par2,par3传入函数的时候,其实就有了地址的副本,这些副本就和外面par2,par3的地址指向是一样的.

但是我们为par2, par3赋了值, 改变了地址指向,于是地址就指向了新的对象和数组.这样其实内部和外部的par2,par3就不是指向同一个地址的了.

为了证明这个问题,我们可以试着不赋值给他们,而是直接使用自身的对象.代码如下:

var par1 = 1; //数字(值类型)
var par2 = []; //数组(引用类型)
var par3 = {}; //对象(引用类型) function Test(par1, par2, par3) {
par1 = 3;
par2.push(10);//操作自身对象
par3.a = 2; //操作自身对象
} Test(par1, par2, par3); alert(par1);//输出1
alert(par2);//输出10
alert(par3.a);//输出2

事实证明了,当我们调用函数传入值类型参数时,我们传入的就是值,传入引用类型的值时,我们传入的,就是他们的地址.

05-03 23:47