独书先生 Menu

js按值传递和按引用传递的区别 | 坑点提示

1.概念

按值传递: 函数内参数的值被改变,不影响外部的变量
按引用传递: 函数内参数的值被改变,影响外部的变量

2.例子

(1)按值传递

var a = 1;
function foo(x) {
x = 2;
}
foo(a);
console.log(a); // 仍为1, 未受x = 2赋值所影响

(2)按引用传递

var obj = {x : 1};
function foo(o) {
    o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, 被修改了!

3.坑点提示

var foo = {name:'foo'};
function test(o){
   o = {name:'bar'};  
}
test(foo);
console.log(foo.name); // 'foo',没有被修改

分析

本来foo传入test方法,是可以在方法内部修改foo的属性的,但是在内部直接对形参o重新赋值了一个新的对象{name:’bar’},而对象赋值给o其实是赋值这个对象的地址,等于是把形参o的地址引用链接到了{name:’bar’},而此次赋值之前o是链接到外部foo对象上的,此操作等于是断开了o与foo对象的关系,所以并没有对foo造成修改。
所以,要想修改foo内部属性值,必须使用上述按引用传递的例子,使用 对象.属性 = 'XXX'的方式,如:o.name = 'bar'

参考自:https://www.cnblogs.com/QingChengFE/p/4543608.html,感谢!