最近看到javascript函数参数传递都是按值传递这个问题,实在是纠结,老是感觉对象的传递是引用传递,其实就是叫法不同而已,每个人对引用传递的理解角度也不一样,最后自我感觉找到正确的原因,记录下来,以备后查;
这个问题的重点在哪里? 我的答案是首先要搞清楚按值传递和按引用传递到底是啥?
这个值传递就不讨论了,很明显,传的就是值的副本;
按引用传递呢? 传递的是对象的引用(包括引用副本)就是引用传递吗?如果这么理解引用传递,那么javascript中的对象传递就属于引用传递了!正确的引用传递的理解应该是传递的就是对象的引用本身,而不是副本,即修改传递的参数,一定能改变对象,才能算是引用传递(如 c# 中的 ref,out)。
javascript 参数对象的传递 传递的 对象的引用(地址)的副本,如下代码及图
- function setName(o){
- o.name="koself";
- }
- var obj=new Object();
- setName(obj);
- alert(obj.name);
- //输出koself
obj和o都指向对象;o可以理解为保存了对象的地址副本;修改o指向的对象的属性,obj的属性肯定会变,但是如果把o本身变了,如 o = new Object(); 再变化o.name = "test"; 这样,obj.name肯定不会变;如下代码
- function setName(o){
- o.name="koself";
- o = new Object();
- o.name = "test";
- }
- var obj=new Object();
- setName(obj);
- alert(obj.name);
- //输出koself
因此,javascript高级程序设计中得出,是值传递;
所以,对定义的理解不一样,会导致出现所谓的纠结,其实也不属于错误;
大家可以对照 c# ref的用法,ref(C#参考) ,这个是纯正的引用传递;就可以看出不同之处;
以上属于自己的理解,程序用的是网上的程序,主要给自己一个记忆,同时希望对大家有帮助,大家可以帮助指正,谢谢!