在js一切都是值传递

来源:互联网 发布:java烟台工资一般多少 编辑:程序博客网 时间:2024/06/06 12:42
“传一个指针进去。。也是传指针的值进去。
传一个整数进去,也是传那个数字的值进去。”


今早整理笔记的时候发现了老久之前不知在哪抄下来的东西:
传值传递和传址传递
传值:
var p = 2;function f(p){ p = 3;}f(p);p// 2// 修改复合类型的参数值var o = [1,2,3];function f(o){    o = [2,3,4];}f(o);o // [1, 2, 3]
**********************************************
传址:
var o = { p:1 };function f(obj){    obj.p = 2;}f(o);o.p // 2// 修改数组的属性值var a = [1,2,3];function f(a){    a[0]=4;}f(a);a // [4,2,3];
我就纳闷了,传值和传址第二个例子传的参数不是一样的吗,怎么一个叫传值一个叫传址了。。。

再形变一下,我就蒙了:
var o = [1,2,3];function f(o){    o = [2,3,4];     o[1]=5;console.log(o);// [2,5,4]}f(o);console.log(o); // [1, 2, 3]
</pre><pre name="code" class="javascript">var o = [1,2,3];function f(o){    o[1]=5;    o = [2,3,4];console.log(o);// [2,3,4]}f(o);console.log(o); // [1, 5, 3]


寻找真相。。。
********************真相只有一个************************
原来,在js里面,所有的函数,都是值传递。要么传递变量的地址值,要么传递变量的值。例如 var o = [1,2,3]。这个o是啥?学过c++都知道,你可以理解o是指向数组的指针。对不对。那么。你调用函数。只是把o的指针的值拷贝过去。
var o = [1,2,3];function f(o){   o[1]=5;   o = [2,3,4];   console.log(o);}
换个变量容易说事儿,
var o = [1,2,3];function f(_o){_o[1] = 5;_o = [2,3,4];console.log(_o);}
_o是o的一个值副本,大家都指向同一个内存数组对象,刚开始_o[1] = 5;就是修改了原数组的值。而_o = [2,3,4];_o已经指向了另外一个内存数组对象,已与o无关,这时,修改的话也对原数组,即o指向的拿块没有任何关系了。如果换了顺序,先执行_o = [2,3,4];那么_o更早指向新的内存数组对象,_o[1] = 5;只是对新的数组进行修改,对o指向的原数组并无影响。
不赋新值,操作的还是原对象,赋了新值,则与原对象无关。

意犹未尽是吗?推荐一个讲解更为详尽的link:

JS 中没有按地址(引用)传递,只有按值传递



0 0
原创粉丝点击