一道题

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

解析

JS引用类型指针的工作方式

  首先是a指向了一个对象{n:1},b指向了a所指向的对象
  然后 a.x = a = { n:2 }
  js赋值运算顺序为从右往左,不过由于"."运算符优先级最高,所以先计算a.x。此时a指向的对象{n:1 }新增了新的属性x,这个x的值为undefined。
  接着执行赋值预算 a={n:2},这个时候a指向的对象就发生了变化,指向了新的对象 {n:2}。
  继续执行 a.x = a。此时啊a.x已经指向了对象{n:1,x=undefined}中的x,等待被赋值,那么这个对象就变成了{n:1,x:{n:2}},也就是b所指向的对象。

本质在于 .运算优先于=赋值运算

如果还是理解不了,可以看图

1.jpg

2.jpg

其实这种题也只能拿来做考题,正常也不会有人这么写代码,写出来怕自己也理解不了。更多的写法是分开写会好一些。

譬如:

var a={n:1};
var b={n:2};
var c=a;
var d;

b.x=d=a.x=a={n:3}
//等价于
a.x={n:3};
b.x={n:3};
a={n:3};
d={n:3}
//结果是
a : {n:3}
b : {n:2,x:{n:3}}
c : {n:1,x:{n:3}}
d : {n:3}

原文链接:yinzhuo.online

推荐阅读更多精彩内容