参考自,我再整理一遍。
- 题目如下:
-
1 var a = {n:1}; 2 var b = a; 3 a.x = a = {n:2}; 4 alert(a.x); 5 alert(b.x);
输出为 undefined, {n:2} .
-
连等赋值时,对于 a.x = a = {n:2};
- 解析器先解析 a.x , 再解析a,得到他们的指针
- 解析a.x的指针,因为此时a的指针指向的是 {n:1} , ‘x’属性并没有声明,先创建一个该属性,所以 {n:1}变为 {n:1, x:null}
- 解析a.x的指针,因为此时a的指针指向的是 {n:1} , ‘x’属性并没有声明,先创建一个该属性,所以 {n:1}变为 {n:1, x:null}
- 再做赋值操作。
- 根据赋值的右结合性,上面的代码可以写为 a.x的引用 = (a的引用 = {n:2})
- 即先将值 {n:2} ,赋值给 a的引用 ,再赋值给 a.x的引用 ,但此时a已经指向 {n:2} , a.x 就是 ({n:2}).x ,但是 {n:2}并没有该属性
- 再将 {n:2} 赋值给 a.x的引用 ,即也是 b.x的引用 ,所以 {n:1, x:null}变为 {n:1, x: {n: 2}}
- 解析器先解析 a.x , 再解析a,得到他们的指针
-