var a = {n:1};
var b = a; // 持有a,以回查
a.x = a = {n:2};
alert(a.x);// --> undefined
alert(b.x);// --> {n:2}
话不多说,先上代码, 讲道理这个a.x
,为什么弹出来不是 {n:2}
呢
先是执行 a={n:2}
,然后再执行a.x=a
,或者a.x={n:2}
为什么a.x是undefined呢
分析如下:
a.x = a = {n:2};
点的优先级高于等号,也就是这个三连等中a.x
中的点,先运行,也就是a指向的那个对象{n:1}中,再往里加个名为x的属性,这个x指向null,然后再从右到左赋值。
此时的内存中的堆状况这样子
a指向一个对象,然后内存中又开辟了另一个地址用于存放
{n:2}
这个对象然后我们假设给他们弄个内存地址
假设a对象地址从2000开始,假设a.x的地址是2002
然后从右到左先是
a = {n:2}
把{n:2}这个地址赋值给变量a那么a指向新的对象了,
上面的三连等就相当于
那么此时的a中根本没有x这个属性,alert出来肯定是undefined,然后b指向a的对象,所以b.x={n:2}