var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(a.x) //undefined
console.log(b.x) //{n == 2}
解释:
var b = a; 对象存贮在堆内存,a和b同时引用 {n:2}
赋值操作为从左到右操作,但是 . 的优先级要高于 =
所以先执行a.x,此时a和b的共同索引为{n:2;x:undefined}
然后执行a = {n:2},a的引用改变,指向了新对象{n:2},而b依然指向的是旧对象。之后执行a.x = {n:2}的时候,并不会重新解析一遍a,而是沿用最初解析a.x时候的a,也即旧对象,故此时旧对象的x的值为{n:2},旧对象为 {n:1;x:{n:2}},它被b引用着。
后面输出a.x的时候,又要解析a了,此时的a是指向新对象的{n:2},而这个新对象是没有x属性的,故访问时输出undefined;而访问b.x的时候,将输出旧对象的x的值,即{n:2}。
因篇幅问题不能全部显示,请点此查看更多更全内容