之前有一篇文章深拷贝和浅拷贝说明了js中传值和传引用,或者叫值传递和引用传递。

可能是我闲的蛋疼吧。

假设有这样一段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
var a = 1;
var obj1 = {item:true}
var obj2 = {item:false}

function changeValue(a,obj1,obj2){
a = 123;
obj1 = {item:false}
obj2.item = true;
}
changeValue(a,obj1,obj2)
console.log(a)
console.log(obj1)
console.log(obj2)

执行结果是

1
2
3
123
{item:true}
{item:true}

关于传值、传地址、传引用。我是在一片c++的博文找到的,不知道准不准确。

按文中说法,如果是传引用的话,没有实参的拷贝,对形参的修改必然反映到实参上,而这里没有。而传地址,只有对形参指向的对象的修改,才会影响实参,对形参本身的修改(这里的obj2修改的不是自己,而是自己指向的对象),并不会影响实参(这里的obj1指向了另一个对象,也就是更新了变量保存的地址)。

所以我觉得这里因该是传地址。

顺便提一下,我在看java的时候,所有地方都说java只有值传递!!!

传地址是不是也是一种传值呢,java的非基本数据类型,栈上的变量存的也是对象在堆中的地址。

再贴一条我在stackoverflow上看到的讨论帖Is JavaScript a pass-by-reference or pass-by-value language?,我觉得上面解释是符合这段代码的结果的。

欢迎来怼。。。