js的所有参数传递都是值传递

98 阅读2分钟

核心

一定记住这句话

  • js的所有参数传递都是值传递

对比验证

  • 对于基本类型而言,值传递毋庸置疑

这里用一个函数改变Number的值,显然是值传递:
在这里插入图片描述

  • 对于引用类型而言,其实也是值传递,而这个值就是对象的存储地址

这里用一个函数改变Array的值:
在这里插入图片描述
这里的函数参数是我声明数组对象的地址的一份拷贝,所以在函数内试图改变数组,确实产生了作用

同样,用一个对象做一个验证:
在这里插入图片描述
这里通过函数对一个简单对象添加了属性,结果证明也成功了,但我们要明确的是这仍然是值传递的结果

不是引用传递的原因

利用反证法证明

以引用参数的思路,修改上面的函数,利用函数让引用重新指向一个新的对象,且这个新对象只有一个name为jack的属性
在这里插入图片描述
如果为引用传递,经过函数对引用指向对象的修改,输出结果应该是只有name属性为jack的对象。

但由上图执行结果,函数外对象并未产生预期改变。

事实上,在f(x)函数中,函数参数指向了一个新的对象,但也只是让新的对象存储地址赋给函数参数,而原本的函数参数也只是函数外对象a地址的一份拷贝,所以函数内参数发生改变,丝毫不影响外面的对象。

而函数中给对象添加新的属性age并赋值12这一操作,实在函数的参数仍未被新对象赋值前,对函数外对象产生的作用。

如果提前改变函数的参数值,就会有如下的结果:
在这里插入图片描述
此时,函数参数被新对象赋值,不再是原来对象a地址的拷贝,因而此后的操作都与对象a没有了任何关系,这也进一步验证了js的函数参数传递不是引用传递,而是值传递。