参考自,我再整理一遍。

  1. 题目如下:
    1. 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} .     

    2. 连等赋值时,对于 a.x = a = {n:2}; 

      1. 解析器先解析 a.x , 再解析a,得到他们的指针
        • 解析a.x的指针,因为此时a的指针指向的是 {n:1} , ‘x’属性并没有声明,先创建一个该属性,所以 {n:1}变为 {n:1, x:null}
      2. 再做赋值操作。
        1. 根据赋值的右结合性,上面的代码可以写为 a.x的引用 = (a的引用 = {n:2}) 
        2. 即先将值 {n:2} ,赋值给 a的引用 ,再赋值给 a.x的引用 ,但此时a已经指向 {n:2} , a.x 就是 ({n:2}).x ,但是 {n:2}并没有该属性
        3. 再将 {n:2} 赋值给 a.x的引用 ,即也是 b.x的引用 ,所以 {n:1, x:null}变为 {n:1, x: {n: 2}} 
posted on 2019-09-29 11:56  ddfa  阅读(144)  评论(0编辑  收藏  举报