在讲之前,先出一道经典面试题:
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);
接下来是多个赋值运算符的运算,
摘自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...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。