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

Posted 小小码农,可笑可笑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何证明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中是没有引用传递的,都是值传递。

 

 

以上是关于如何证明JavaScript中函数参数都是值传递的主要内容,如果未能解决你的问题,请参考以下文章

讨论java中调用函数,形参的传递是值传递还是引用传递的问题

Javascript 之《函数传参到底是值传递还是引用传递》

254 在js调用函数时,传递变量参数时, 是值传递还是引用传递

关于js参数传递矛盾新理解

思考java中core属性的特殊值,如何传递到底是值ins中的类目,全解答过程

Java调用函数传递参数到底是值传递还是引用传递