a.x = a = {n:2}连续赋值

329 阅读1分钟
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 
}

这题的关键的在于运算符优先级和连续赋值时引用的暂存