var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(b.x) // {n:2}
console.log(a.x) // undefined
var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(b.x) // {n:2}
console.log(a.x) // undefined
assignment expression/evalution:
If LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral, then
- Let lref be the result of evaluating LeftHandSideExpression.
- ReturnIfAbrupt(lref).
If IsAnonymousFunctionDefinition(AssignmentExpression) and IsIdentifierRef of LeftHandSideExpression are both true, then
- Let rval be the result of performing NamedEvaluation for AssignmentExpression with argument GetReferencedName(lref).
Else,
- Let rref be the result of evaluating AssignmentExpression.
- Let rval be ? GetValue(rref).
- Perform ? PutValue(lref, rval).
- Return rval.
......
赋值左侧先求值(1.1), 此时 a.x
求值结果为 b.x
(此时 a
就是 b
;此后 a 的改变不影响这一结果)。
然后右侧求值(1.4.1),求值过程中 a
被改变了,变成了 {n:2}
。此后 a
于 b
不在是同一对象。
右侧求值的结果是 {n:2}
最后,右侧求值的结果被赋值给左侧(1.6)。b.x
变为 {n:2}
。a
为 {n:2}
,a.x
是 undefined
。
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
点的优先级高于=
a.x = a = {n: 2} 这个等式中,将a.x取出 a.x指向一个内存
然后从右向左开始赋值 a = {n:2} a.x = a