首先看下面的js函数输出什么
function change ( o ) {
o.name = "abcd";
o = new Object();
o.name = "1234"
}
var obj= new Object();
change( obj );
console.log( obj.name );
如果你的答案是‘abcd’,那么可以忽略下面了
咋一眼看上去,我的第一感觉是输出 1234,但其实际的输出为 abcd
弄错的原因:
认为obj和o是同一个东西,即obj和o是内存中的同一块地址,其实不然,obj和o是内存中两块不一样的内存。这时可能会有人说,js的对象参数不是按引用传递的吗?这样obj和o不就是一样了?
没错是按引用传递,但obj和o可以说一样,也可以说不一样。
一样的点
obj和o指向(注意是指向)的是同一块内存
不一样的点
obj和o本质上是两个不同的变量。
要理解上面的结果,首先得明白四个点
- 对象的创建过程
- 变量的复制过程
- 对象的赋值过程
- 参数的传递过程
1.对象的过程
执行下面语句时,其内存中变量的创建过程如图所示
var obj= new Object();
即是创建了两块内存地址
变量的复制过程
例如执行以下语句,内存的执行的操作如下图所示
a=5;
b=a;
而对象的复制过程一样,知识里面的5可以想象成是对象的内存地址
参数的传递过程
在参数传递的过程中,会复制一份所传入变量的副本,执行以下语句时内存中的表现如下图所示。
o=obj;
最后
由图可以看出o和obj在内存中不是同一个内存地址,但是o和obj值指向的是同一个对象。
当执行 下面语句时,内存中表现为如下图所示
o.name = "abcd";
o = new Object();
o.name = "1234"
可见obj的name属性没有改变