如何证明JavaScript中函数参数都是值传递

二话不说,上代码

function setName(obj){
    obj.name = '小码农';
}
let coder = new Object();
setName(coder);
console.log(coder.name);//小码农

代码很简单,那我们思考下这里的obj和coder是什么关系?

我们把问题陈述详细点。我们都知道

  • JavaScript的变量类型有两种,一种是原始类型,一种是引用类型。
  • coder肯定是引用类型,正常我们说的引用类型的复制是复制引用,也就是指针(注)
  • 那现在函数内的参数obj和coder是复制关系

那么问题来了,obj复制的是coder的引用吗?

思考下......

我们上代码

function setName(obj){
    obj.name = '小码农';
    obj = new Object();
    obj.name = '百变码农'
}
let coder = new Object();
setName(coder);
console.log(coder.name);//小码农

没错,还是小码农。所以obj复制的不是coder的引用,而是值。

没理解?

我开始也是不理解的,请教了女朋友之后,一顿讲解,懂了。

其实我不理解的主要是因为不理解什么是引用传递。

无论是JavaScript还是java实际都是没有引用传递的,都是值传递。

我不想把引用传递复杂化。所以解释的简单一些。

如果是引用传递,那么setName方法中的参数obj实际就是coder,不是副本,不是另一个对象,仅仅是coder的别名,因此函数中实际操作的就是coder对象。所以,如果obj重新new了个对象,是引用传递的话,也就是coder将重新指向新的对象,那最后打印的就应该是百变码农。所以这个例子侧面证明了JavaScript中是没有引用传递的,都是值传递。

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值