若是你在网上搜索js连续赋值,那么能够看到几乎都是如下这道题目javascript
var a = { n: 1 }; var b = a; a.x = a = { n: 2 }; console.log(a.x); console.log(b.x); // undefined // { n: 2}
结果是否是和你想的不同呢?这个解题思路在问答javascript 连等赋值问题,在这里能够看到不少,看完后我也认为是运算符优先级的问题,如下就结合其余人的想法和本身的思路作个总结。java
咱们分开分析segmentfault
var a = { n: 1 }; var b = a;
a和b都指向{n:1}(咱们且称为对象A,方便后面理解
)code
接着看下这段代码中有几个运算符?对象
a.x = a = { n: 2 };
有 赋值运算符 =
和 成员访问运算符 .
两个运算符
在上面的代码中,咱们很容易忽视一个运算符:成员访问运算符.
。它的优先级为:19,仅仅比圆括号运算符()
的优先级:20低,而赋值运算符=
的优先级为:3
因此运行过程是ip
1.先获取对象A的属性x等待后面运算结果赋值
2.a={n:2}
将变量a改成指向{n:2}(咱们且成为对象B
)
3.给对象A的x属性赋值,即指向对象B:{n:2}get
运行下来
b仍是指向对象A:{n:1,x:{n:2}}
a指向对象B:{n:2}
console
因此
a.x为undefined
b.x为{n:2}
变量