JS 中所有函数的参数的传递都是按值传递的!!!
按值传递
那什么是按值传递呢?
按值传递就是把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。
let value = 1;
fn(value)
// 注意:【传进去的是 value 变量的副本 _value !!】
因为传进去的是 value 变量的副本,所以在函数里面修改的都是副本的值,所以里面的修改,不会影响到外面 value 变量本身!!
按引用传递
什么是按引用传递呢?
按引用传递就是传递对象的引用,函数内部对参数的任何改变都会影响该对象的值,因为两者引用的是同一个对象。如下:
var obj = {
value: 1
};
function foo(o) {
o.value = 2;
console.log(o.value); //2
}
foo(obj);
console.log(obj.value) // 2
嘶,不对啊,JS 中所有函数的参数都是按值传递的,那为什么 obj 的属性还会受到影响呢? 接着往下看:
按共享传递【本质上也是按值传递】
按共享传递是指,在传递对象的时候,传递对象的引用的副本。【即_obj】
所以进行修改时,
- 修改 o.value,可以通过引用找到原值。并修改
- 但是直接修改 o 的值(指向)时,并不会修改原 obj ,因为此时修改的是 _obj
因为拷贝引用的副本也是一种值的拷贝,所以也认为引用类型的参数的传递也是按值传递了。