思考下面的结果
var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(a.x) // 这时 a.x 的值是多少
console.log(b.x) // 这时 b.x 的值是多少
解析: 首先,执行
var a = {n:1}
var b = a
结果: a和b 都指向同一个引用地址

这一步很好理解,重要的是第三行代码:
a.x = a = {n: 2};
这里就要理解js运算符的优先级,我一开始也无法理解这一行代码如何运行
优先级可以查看:js 运算符优先级
可以看出.运算符的优先级大于赋值运算符,所以先计算了a.x,这时候可以看到a指向的对象{n:1}新增了属性(虽然x的属性为undefined),如下图:

接着,依循“从右往左”的赋值运算顺序先执行 a={n:2} ,这时候,a指向的对象发生了改变,变成了新对象{n:2}:

最后执行a.x = a,可以得到:

所以当执行console.log(a.x),a是指向对象B的,但对象B没有属性x,所以返回undefined,
而在console.log(b.x)的时候,由于b.x表示对象A的x属性,该属性是指向对象B,自然也输出了{n:2}
运行代码:
