欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-07 11:18:36
let a = {n : 1}; let b = a; a.x = a = {n: 2}; console.log(a.x) console.log(b.x)解题思路:a指向了一个对象{n:1}a浅拷贝给了b,此时b也指向了对象{n:1}图解“.”的优先级高于“=”,所以先计算a.x,也就是在a中添加属性x(此时这个x是undefined).a-->{n:1,x:undefined}a--......

        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. 图解let a = {n : 1};let b = a;a.x = a = {n: 2};console.log(a.x) console.log(b.x)
  4. “.”的优先级高于“=”,所以先计算a.x,也就是在a中添加属性x(此时这个x是undefined).a-->{n:1,x:undefined}
  5. a-->{n:1,x:undefined},b-->{n:1,x:undefined}   
  6. 图解let a = {n : 1};let b = a;a.x = a = {n: 2};console.log(a.x) console.log(b.x)
  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. 图解let a = {n : 1};let b = a;a.x = a = {n: 2};console.log(a.x) console.log(b.x)
  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. 图解let a = {n : 1};let b = a;a.x = a = {n: 2};console.log(a.x) console.log(b.x)
  13. a中没有x,所以a.x=undefined,b.x={n: 2}

 

本文地址:https://blog.csdn.net/Web_J/article/details/107471318

相关标签: 面试题