JS 的基本类型,是按值传递的.
var a = 1;
function foo(x) {
x = 2;
}
foo(a);
console.log(a); // 仍为 1, 未受 x = 2 赋值所影响
再来看看对象的传递:
var obj = {x : 1};
function foo(o) {
o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, 被修改了!
var obj = {x : 1};
function foo(o) {
o = {z:3};
}
foo(obj);
console.log(obj.x); // 仍然是 1, obj 并未被修改为 100.
console.log(obj.z) // undefined
可以看出,对象的值得传递并不是按引用传递.其实,按共享传递 call by sharing,准确的说,JS 中的基本类型按值传递,对象类型按共享传递的 (call by sharing,也叫按对象传递,按对象共享传递).
该策略的重点是:调用函数传参时,函数接受对象实参引用的副本 (既不是按值传递的对象副本,也不是按引用传递的隐式引用). 它和按引用传递的不同在于:在共享传递中对函数形参的赋值,不会影响实参的值.
总之,基本类型是按值传递,而对于对象来说传入的是对象指向的地址,也可以认为其是特殊的按值传递.如果在函数内对对象的属性进行操作,实际就是对其指向对象的属性进行操作.但是,如果对其整体进行操作(比如:o = 100 或者 o = {z:3}),其实际是新定于了对象,实参的引用地址为新的对象的引用地址,与原来的引用没有任何关系,所以不会对原来的对象造成改变.
来源: http://www.jianshu.com/p/5a70a5184575