请看下面代码
var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(a.x); // undefined
console.log(b.x); // {n: 2}
刚看到输出结果的时候,确实很懵逼,研究了半天,才弄懂了!!!
关键在于,其实
a.x = a = {n: 2};
相当于:
a.x = {n: 2};
a = {n: 2};
那么,从头分析:
【值 vs 引用】
1、如果变量存储的是原始值,这个变量就是【值类型(基本类型)】
2、如果变量存储的是内存地址,这个变量就是【引用类型(复杂类型)】,也就是对象。
值 类 型:在赋值的时候,拷贝值。
引用类型:在赋值的时候,只拷贝地址。
var a = {n: 1};
将复杂数据类型的对象 {n: 1} ,赋值给变量a,变量a保存的是对象的内存地址;
var b = a;
将变量a,赋值给变量b
其实:是将a保存的内存地址拷贝了一份,赋值给了b,此时,a 和 b都保存的是【同一份地址】,都指向{n: 1}
a.x = {n: 2};
给a创建了一个属性x,并保存了新对象{n: 2}的地址
注意:a 和 b 都存储着「同一块内存」的地址!那么,当我们修改 a.x 的时候,b.x 也会跟着变!!!
所以,console.log(b.x); // {n: 2}
a = {n: 2};
将新对象{n: 2}的地址,赋值给a
此时的a,已经指向新对象{n: 2},【而这个对象,并没有x属性】
所以,console.log(a.x); // undefined