这是一个朋友问我的问题。他说代码片段一好理解,但疑问在代码片段二 为什么不是输出一个空对象?
代码片段如下两个:
code segment 1
var obj = {}; obj.x = 1; obj.y = 2; function test(obj) { obj.x = 111; } test(obj); console.log(obj); // result >>>>>>>>> {x=111,y=2}
code segment 2
var obj = {}; obj.x = 1; obj.y = 2; function test(obj) { var obj2 = {}; obj = obj2; } test(obj); console.log(obj); // result >>>>>>>>> {x=1,y=2}
以下是我的理解
代码片段一就不在讲述,但凡对值类型和引用类型有一定的了解的话,那这个应该是没疑问的。
代码片段二有两个应该注意的地方:
1.test方法内变量的寻址
test方法内部可以取到三个变量,新定义了的对象obj2、参数obj、还有方法外的obj。这三个参数有一个特别要注意的地方是,后面两个的名字是一样的,这样在方法运行的时候一定会优先取得参数的那个obj变量。而方法外的那个obj参数实际相当于window.obj。
2.变量的传递过程
在调用test方法,并传入方法外的obj变量,实际相当于传入window.obj这样一个引用类型,引用类型的特点是在传递的过程中并不进行自身的值复制,而是传入地址的拷贝,也就是说代码“obj = obj2;”实际是对这个拷贝的地址的改变,因为这个地址只是个拷贝,所以这并不会改变其指向的真实对象。而代码片段1的"obj.x = 111;"这会通过obj这个地址查询到x这个属性,并对其赋值。
有点绕,虽然能理解其中的具体含义,但是也没有好的语言来表达,有好资料的朋友欢迎回复来探讨。