在js一切都是值传递

“传一个指针进去。。也是传指针的值进去。
传一个整数进去,也是传那个数字的值进去。”


今早整理笔记的时候发现了老久之前不知在哪抄下来的东西:
传值传递和传址传递
传值:
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 中没有按地址(引用)传递,只有按值传递



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值