传值 是把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 传地址 是传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象 传引用 真正的以地址的方式传递参数 传递以后,行参和实参都是同一个对象,只是他们名字不同而已 对行参的修改将影响实参的值
当参数是值类型的时候
1
2
3
4
5
6
7
|
function
changeStuff(num){
num = num * 10;
}
var
num = 10;
changeStuff(num);
alert(num);
//10
|
可以看到当函数参数是值类型的时候在函数内部改变变量的值,不会在函数作用域外表现出来,说明函数参数是传值的方式传入函数内部。 当函数参数是Object类型的时候
1
2
3
4
5
6
7
8
9
|
function
changeStuff1(obj1){
obj1.item =
"changed"
;
}
var
obj1 =
new
Object();
obj1.item =
"unchanged"
;
changeStuff1(obj1);
alert(obj1.item);
//changed
|
这时obj1内的item的值在函数之外表现出来了,如果是传值的话,函数内部改变变量的值应该不会影响到外部的obj1啊。难道对Object类型的参数传的是传引用? 再看第三个例子
1
2
3
4
5
6
7
8
9
|
function
changeStuff2(obj2){
obj2 = {item:
"changed"
};
}
var
obj2 =
new
Object();
obj2.item =
"unchanged"
;
changeStuff2(obj2);
alert(obj2.item);
//unchanged
|
在第二个例子中,obj1传入函数 changeStuff1 时,changeStuff1函数内部变量 obj1是一个新的内存变量,只是期指向旧的对象值,所以改变对象中item的值会在函数外部表现出来。
在第三个例子中obj2传入函数 changeStuff12时,changeStuff2函数内部变量 obj2是一个新的内存变量,依旧期指向旧的对象值,但在函数内部又给内部的obj2变量重新赋值,使其指向一个新的对象,所以改变对象中item的值不会影响函数外部的obj2对象。
最后得出结论,
JavaScript 中所有函数的参数都是按值传递的 ,只是对于Object类型来说,这个值本身就是一个指向Object对象的地址。最后给出完整的测试函数
[2]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
function
changeStuff(num, obj1, obj2)
{
num = num * 10;
obj1.item =
"changed"
;
obj2 = {item:
"changed"
};
}
var
num = 10;
var
obj1 =
new
Object();
obj1.item =
"unchanged"
;
var
obj2 =
new
Object();
obj2.item =
"unchanged"
;
changeStuff(num, obj1, obj2);
alert(num);
//10
alert(obj1.item);
//changed
alert(obj2.item);
//unchanged
|