引用变量赋值问题
- 2个引用变量指向同一个对象,当通过其中一个引用变量修改其指向对象的内部存储内容时,另一个引用变量也会看到。
- 2个引用变量指向同一个对象,当其中一个引用变量指向一个新的对象时,另一个引用变量还是指向原来的对象。
示例
说明问题:2个引用变量指向同一个对象,当通过其中一个引用变量修改其指向对象的内部存储内容时,另一个引用变量也会看到。
var obj1 = {name:'vivi'};
var obj2 = obj1;
obj1.name = 'Tom';
obj2.age = 15;
console.log(obj2.name); //Tom
console.log(obj1.age) ;// 15
function f1(obj) {
obj.age = 12;
}
f1(obj2);
console.log(obj1.age);
画图理解
两个引用变量指向的对象属于同一空间的,所以无论是通过obj1还是obj2修改其内部数据,两者都可以看到修改过后的内容。
示例
说明问题:2个引用变量指向同一个对象,当其中一个引用变量指向一个新的对象时,另一个引用变量还是指向原来的对象。
var obj3 = {name: 'Tom'}
var obj4 = obj3
obj3 = {name: 'JACK',age:19};
console.log(obj4.name);
console.log(obj3.age,obj3.name);
function f2(obj) {
obj = {name: 'Bob'};
}
f2(obj4)
console.log(obj4.name)
运行结果
画图理解
-
var obj3 = {name: 'Tom'}
:首先将对象{name:‘Tom’}的地址值赋值给obj3; -
var obj4 = obj3 ;
:再将obj3保存的数据内容赋值给obj4,此时obj4和obj3指向同一个对象,即,对象{name:‘Tom’}; -
obj3 = {name: 'JACK',age:19};
:将对象{name:'JACK‘,age:19}的地址值赋值给obj3; -
console.log(obj4.name);
:控制台输出obj4.name,即,‘Tom’; -
console.log(obj3.age,obj3.name);
:控制台输出obj3.age,obj3.name,即,19 ‘JACK’ -
function f2(obj) { obj = {name: 'Bob'}; }
:f2的函数声明,函数体包含一条语句: obj = {name: ‘Bob’}; -
f2(obj4)
:调用函数f2,将实参obj4传递给形参obj,也就是说,此时obj4和obj指向的是同一个对象;
但在函数体内,又将新对象{name:‘Bob’}的地址值赋值给了obj,此时obj不再指向obj4指向的对象,而是一个新的对象,obj随着函数体执行结束而被释放 1 ,obj所指向的对象在后面某个时刻被垃圾回收器回收; -
console.log(obj4.name);
:控制台输出obj4.name,即,‘Tom’;
释放内存
↩︎