JS 参数传递都是值传递

传值   
 是把实参的值赋值给行参   
 那么对行参的修改,不会影响实参的值 

传地址   
 是传值的一种特殊方式,只是他传递的是地址,不是普通的如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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值