核心
一定记住这句话
- js的所有参数传递都是值传递
对比验证
- 对于基本类型而言,值传递毋庸置疑
这里用一个函数改变Number的值,显然是值传递:
- 对于引用类型而言,其实也是值传递,而这个值就是对象的存储地址
这里用一个函数改变Array的值:
这里的函数参数是我声明数组对象的地址的一份拷贝,所以在函数内试图改变数组,确实产生了作用
同样,用一个对象做一个验证:
这里通过函数对一个简单对象添加了属性,结果证明也成功了,但我们要明确的是这仍然是值传递的结果
不是引用传递的原因
利用反证法证明
以引用参数的思路,修改上面的函数,利用函数让引用重新指向一个新的对象,且这个新对象只有一个name为jack的属性
如果为引用传递,经过函数对引用指向对象的修改,输出结果应该是只有name属性为jack的对象。
但由上图执行结果,函数外对象并未产生预期改变。
事实上,在f(x)函数中,函数参数指向了一个新的对象,但也只是让新的对象存储地址赋给函数参数,而原本的函数参数也只是函数外对象a地址的一份拷贝,所以函数内参数发生改变,丝毫不影响外面的对象。
而函数中给对象添加新的属性age并赋值12这一操作,实在函数的参数仍未被新对象赋值前,对函数外对象产生的作用。
如果提前改变函数的参数值,就会有如下的结果:
此时,函数参数被新对象赋值,不再是原来对象a地址的拷贝,因而此后的操作都与对象a没有了任何关系,这也进一步验证了js的函数参数传递不是引用传递,而是值传递。