js连等赋值与对象引用

引自 http://www.iteye.com/topic/785445

   var a = {n:1}; //a指向了一块地址{n:1};
   var b = a;  //持有a,以回查  //b对a的引用,也指向那块地址{n:1};
   a.x = a = {n:2}; 
   alert(a.x); // --> undefined 
   alert(b.x); // --> {n:2}

 (js赋值是右结合的,从右边开始向左边赋值) 

猜想:从右到左赋值,a 先赋值为{n:2},a.x 发现 a 被重写后(之前a是{a:1}),a.x = {n:2} 引擎限制a.x赋值,忽略了。步骤如下:

1, a = {n:2};
2, a.x 未被赋值{n:2}

等价于 a.x = (a = {n:2}),即执行了第一步,这样也能解释a.x为undefined了。注意猜想2中a.x压根没被赋值过。

事实是 ----- .运算符优先于=赋值运算

也就是说 a.x (a目前所代表的对象增加x属性)还是指向之前那块地址,后面a又指向了一块新地址{n:2},不再指向之前的地址。若没有b,则找不到a.x的值({n:2}对象存在,只是没有指针指向它)。

原文地址:https://www.cnblogs.com/tblj/p/7028363.html