javascript---传参:不能传递引用类型

总结:

• 按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参。

• 按引用传递(call by reference)时,函数的形参接收实参的隐式引用,而不再是副本。这意味着函数形参的值如果被修改,实参也会被修改。同时两者指向相同的值。

 



1.传递基本类型的值

    var box='lee';                    //传递基本类型的值,参数的值和外面的值无关
    function one(box){
        box=123;
    }
    one(box);
    alert(box);                //lee

解答:这个大家应该都懂,形参不影响实参。

2.传递引用类型(注意不是按引用类型传递)

1     var box=new Object();            //传递引用类型,不是按引用传递,参数的值是地址
2     function one(box){
3         box.name='lee';
4         var box=new Object();
5         box.name='kkk'
6     }
7     one(box)                
8     alert(box.name);        //lee

解答:这里大家可能有疑惑,为什么不是kkk。首先,函数参数是引用类型则传递其地址,即是副本,都是指向同一个值,只是地址不同,然后再在顺着地址找到其值。第3行,添加了name属性,第4行
new了一个对象,此时box指向新的值,此时赋值kkk不再会影响原来的函数外的box值,因为地址指向的值都不相同了。

注意:按引用传递的话,是将整个box对象传递进去,已经不是副本,执行第4行,之前的box值会被覆盖掉,并且box.name='kkk'了。

 

 

 

 结论:对于数字、字符串等是将它们的值传递给了函数参数,函数参数的改变不会影响函数外部的变量。
 对于数组和对象等是将对象(数组)的变量的值传递给了函数参数,这个变量保存的指向对象(数组)的地址。
 当函数改变这个地址指向的对象(数组)的内容时,同时也改变了函数外部变量指向的对象(数组)的内容;当函数改变的是变量的地址时,
 实际就与函数外部的变量失去了联系,变成了完全不同的对象了,不会对函数外部对象造成改变。
 
 
 基本类型值传递的是值,直接访问栈的值
 引用类型传递的是地址,如果在函数内的地址未被改变,则实参会随函数的执行改变而改变;如果地址改变了,则不再与实参有关

 

posted @ 2016-03-20 17:19  GacentJohn  阅读(394)  评论(0编辑  收藏  举报