关于javascript中的值传递和引用传递

javascript一切都是值传递,只不过传递的值是一个引用。
可能有点绕口,来看例子慢慢解释一下。(例子来自

function changeStuff(a, b, c) {
  a = a * 10;
  b.item = "changed";
  c = {item: "changed"};
}

var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};

changeStuff(num, obj1, obj2);

console.log(num);
console.log(obj1.item);
console.log(obj2.item);

所以打印出来的是:

10
changed
unchanged

来进行几个假设:
1. 如果js中全是值传递:那么obj1不应该更改为changed。
2. 如果js中全是引用传递:那么num就应该变为100而不是10。
3. 如果js中基础类型是值传递,对象是引用传递:在这个假设中obj2是进行的引用传递,那么我们更改了obj2的引用指向,但是在打印的时候却发现它还是原值。
4. 如果是本文开头的那样,js中全部是值传递,只不过传递的值是一个引用:num是一个引用,指向了当初内存中的10,但是这个引用是以值传递的,所以修改这个值传递的参数的指向,是无法修改原引用的指向,而obj1的引用也是用值传递的,但是使用引用值访问的成员却是真正的引用,所以能更改成功。

关于这种特殊的值传递,wiki上有一个定义,叫做分享传递(call-by-share)。
希望能够让看到文章的人理解。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值