今天看了尚硅谷javascript高级部分的视频,收获颇大,尤其是这个视频
https://www.bilibili.com/video/BV1p4411u7TT?p=145
老师讲解得非常好,在此整理一下,并附上自己的理解
2个引用变量指向同一个对象,通过一个变量修改对象内部数据,另一个变量看到的是修改之后的数据
光看文字是看不懂的,我们来看一个例子
var a = { name:"Ankry" };
var b = a;
b.age = 12;
console.log(a.age);
答案很明显,是12。刚开始我不懂,为什么明明是把a赋值给b,修改b,关a什么事?
后来弄清楚后,只需要一个图就搞定了
在栈空间里,存储的是变量名。 在堆空间里,存储的是对象本身。
首先在第一步, 栈空间的a指向堆空间的对象{ name = “Ankry” }
var a = { name:"Ankry" };
第二步,把 a 的内容赋值给b,a的内容是地址值,所以 b = a 的地址值,指向同一个对象。
var b = a;
第三步,通过变量 b 修改对象内部数据,因为是指向同一个变量,所以 a.age=12
b.age = 12;
同样如果创建一个函数,也是如此。
这里 obj 是形参, a 是实参,相当于 obj = a;
a 、b、obj 指向同一个对象
var a = { name:"Ankry" };
var b = a;
b.age = 12;
console.log(a.age);
*******
function fn1 (obj){
obj.name = "Brish"
}
fn1(a)
console.log(b.name); //Brish
两个引用变量指向同一个对象,其中一个引用变量指向另一个对象,另一个引用变量依然指向前一个对象。
var a = { age:14 };
var b = a;
a = { name:"Brish" , age:12 };
b.age = 15;
console.log(a.age, b.age, a.name);
a.age = 12 ;
b.age = 15 ;
a.name = Brish
为什么会这样呢?
刚开始 a 和 b 都指向同一个对象,但是 a 又新建了一个对象,指向了新对象
a = { name:"Brish" , age:12 };
于是 b.age =15 ; 而此时 a 不变, a = 12;
此时再用另一个小例子加深一下印象
function fn2( obj ){
obj = { age: 16 };
}
fn2(a);
console.log(a.age); // 12
你会很迷惑,为什么是12?
看一幅图,你就会明白
从这里我们知道,实参传递给形参,相当于 obj = a ;
fn2(a);
a 的内容赋值给 obj ,obj 与 a 同时指向 age:12;
然后函数 fn2 里,相当于给 obj 新创建一个对象,但是并不影响 a 指向的对象
所以最后 a.age = 12 ;
function fn2( obj ){
obj = { age: 16 };
}
函数内部的局部变量会被释放
{ age:16 } 最后会变成垃圾对象