现在的位置: 首页 > 综合 > 正文

关于按引用传递与按值传递

2018年06月10日 ⁄ 综合 ⁄ 共 912字 ⁄ 字号 评论关闭

        最近看到javascript函数参数传递都是按值传递这个问题,实在是纠结,老是感觉对象的传递是引用传递,其实就是叫法不同而已,每个人对引用传递的理解角度也不一样,最后自我感觉找到正确的原因,记录下来,以备后查;

        这个问题的重点在哪里?  我的答案是首先要搞清楚按值传递和按引用传递到底是啥?

        这个值传递就不讨论了,很明显,传的就是值的副本;

        按引用传递呢?  传递的是对象的引用(包括引用副本)就是引用传递吗?如果这么理解引用传递,那么javascript中的对象传递就属于引用传递了!正确的引用传递的理解应该是传递的就是对象的引用本身,而不是副本,即修改传递的参数,一定能改变对象,才能算是引用传递(如 c# 中的 ref,out)。


javascript 参数对象的传递 传递的 对象的引用(地址)的副本,如下代码及图

  1. function setName(o){  
  2.     o.name="koself";  
  3. }  
  4. var obj=new Object();  
  5. setName(obj);  
  6. alert(obj.name);  
  7. //输出koself  

 


obj和o都指向对象;o可以理解为保存了对象的地址副本;修改o指向的对象的属性,obj的属性肯定会变,但是如果把o本身变了,如 o = new Object(); 再变化o.name = "test"; 这样,obj.name肯定不会变;如下代码

  1. function setName(o){  
  2.     o.name="koself";  
  3.     o = new Object();
  4.     o.name = "test";
  5. }  
  6. var obj=new Object();  
  7. setName(obj);  
  8. alert(obj.name);  
  9. //输出koself  

   

  因此,javascript高级程序设计中得出,是值传递;

  所以,对定义的理解不一样,会导致出现所谓的纠结,其实也不属于错误;

  大家可以对照 c# ref的用法,ref(C#参考) ,这个是纯正的引用传递;就可以看出不同之处;

   以上属于自己的理解,程序用的是网上的程序,主要给自己一个记忆,同时希望对大家有帮助,大家可以帮助指正,谢谢!




抱歉!评论已关闭.