前言
我先上结论:JavaScript函数参数采用值传递。这时候可能有人马上举出一个反例,比如:
function set(obj){
obj.a = 123;
}
let obj = {};
set(obj);
console.log(obj.a) //123
这“显然”跟值传递的结果不一样了,不急,且听我慢慢道来
值传递与引用传递概念
- 值传递:在函数调用时,函数内部实际使用的参数会复制一份到函数中,这样函数内部改变参数值的时候,不会影响外部传入参数的值。
- 引用传递:函数调用时,会将参数的地址传入到函数中,函数内部改变参数值,会影响到外部传入参数的值。
为什么说JavaScript是采用值传递
还是来看示例:
function set(obj1){
obj1.a = 123;
obj1 = new Object(); //将obj的地址指向一个新的内存地址
obj1.a = 456;
}
let obj = {};
set(obj);
console.log(obj.a) //123
这时候输出的obj.a依旧为123,说明函数内部的obj1跟外部的obj实际上不是完全一致的。实际上,内部的obj1是在函数内部进行了复制,只是由于对象是引用类型,obj1与obj指向了同一个地址,obj1与obj是不同的两个变量,当改变obj1指向时,只改了函数内部obj1的指向,并不会将外部的obj的指向改变。