let a = {n : 1};let b = a;a.x = a = {n: 2};console.log(a.x) console.log(b.x)

        let a = {n : 1};
        let b = a;
        a.x = a = {n: 2};

   
        console.log(a.x)
        console.log(b.x)

解题思路:

  1. a指向了一个对象{n:1}
  2. a浅拷贝给了b,此时b也指向了对象{n:1}
  3. 图解
  4. “.”的优先级高于“=”,所以先计算a.x,也就是在a中添加属性x(此时这个x是undefined).a-->{n:1,x:undefined}
  5. a-->{n:1,x:undefined},b-->{n:1,x:undefined}   
  6. 图解
  7. 依循“从右往左”的赋值运算顺序先执行 a={n:2} ,这时候,a指向的对象发生了改变,变成了新对象{n:2}。(可能你在这会有疑惑(重点),之前a不是指向了{n:1,x:undefined}吗,赋值不会影响他吗?原因是因为在执行(a.x=)的时候已经被挂起来等待赋值了,即使a发生了指向的变化,但也不再影响此刻的(a.x)了,因为已经对(a.x)进行了指向的确定,只不过他现在正在等待被赋值。a被重新赋值,此时a的指向也就变化了)
  8. a-->{n:2},b-->{n:1,x:undefined}   
  9. 图解
  10. 继续执行 a.x=a相当于a.x = {n: 2},由于在第三步时a.x已经被创建,并且等待赋值,所以x = {n: 2} 。(a.x由于一直等待赋值一直被挂起,也就是一直保持着{n:1,x:undefined}对象x属性的访问,对象{n:1,x:undefined}由于一直有一个b的指向,所以不会被JS的垃圾回收机制给回收,赋值后对象变为了{n:1,x:{n:2}} )
  11. a-->{n:2},b-->{n:1,x:{n: 2}} 
  12. 图解
  13. a中没有x,所以a.x=undefined,b.x={n: 2}

 

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值