在讲之前,先出一道经典面试题:

 var a = {n:1};   
 a.x = a = {n:2};  
 console.log(a.x);

答案是 : undefined
如果对这个答案的得来明白的清清楚楚的就不用再往下看了。

首先要了解运算符的优先级别(MDN地址)

可知,在当前表达式中

a.x = a = {n:2};

最优先的为'.',成员访问运算符
那么上述的代码可以理解为

 var a = {n:1}; 
 var temp = a.x; 
 temp = a = {n:2};  
 console.log(a.x);

接下来是多个赋值运算符的运算,

clipboard.png

                             摘自JavaScript权威指南_第六版 82页

那么

 var a = {n:1}; 
 var temp = a.x; 
 (temp = (a = {n:2}));  
 console.log(a.x);

到这里,大家都明白了吧
a.x的地址获取在 a变化之前
所以导致了,当我们再去访问a.x的时候,其实访问的a已经不是之前的那个a了,自然a.x为undefined

这样更直观一点

 var a = {n:1};
 var b = a;  
 a.x = a = {n:2};  
 console.log(a.x);
 var a = {n:1};
 var b = a;         // 使用b作为a的追踪
 var temp = a.x;    // 这个 相当于 var temp = b.x;
 temp = a = {n:2};  
 console.log(a.x);
 console.log(b.x);  // 这里就是 console.log(temp); => {n:2}

End...


ThenMorning
190 声望18 粉丝

但行好事,莫问前程.