var a = {n:1}
a.x = a = {n:2}
1
= 赋值,优先级3,关联性从右往左
a.x = ( a = {n:2} )
a.x = ( a = ( {n:2} ) )
可以这样a.x
等于a = {n:2}
的值,也就是{n:2}
2
. 赋值,优先级19,关联性从左到右
所以a.x
优先执行
- 获得a的引用{n:1}(指针地址:#001)
- 在a中创建属性x
- 计算
a.x
表达式的结果Result(引用)
表达式a.x
的结果是一个引用,这个引用被暂存下来了且保存了一些计算信息(包括a的指针地址:#001),因为后续可能作为this使用。
表达式就变为了
a.x的Result = a = {n:2}
3
按照1中的顺序开始赋值
a.x的Result = ( a = {n:2} )
变量a被赋予一个新的引用、一个新的指针地址、一个新的值{n:2}(指针地址:#002)
a.x的Result = a
这里a的值已经是{n:2}(指针地址:#002),不在是{n:1}(指针地址:#001)
最后的结果
a(指针地址:#002)={n:2}
那么a.x的Result = a
做了什么?
a(指针地址:#001).x={n:2}
a(指针地址:#001)={
x:{n:2},
n:1
}
只是这个对象没有属性或变量引用,无法查看
var a = {n:1}
var b = a
a.x = a = {n:2}
最后
b={
x:{ n : 2},
n:1
}
a={
n : 2
}
这题的关键的在于运算符优先级和连续赋值时引用的暂存