let a = {n : 1};let b = a;a.x = a = {n: 2};console.log(a.x) console.log(b.x)
程序员文章站
2022-06-15 16:58:13
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)
解题思路:
- a指向了一个对象{n:1}
- a浅拷贝给了b,此时b也指向了对象{n:1}
- 图解
- “.”的优先级高于“=”,所以先计算a.x,也就是在a中添加属性x(此时这个x是undefined).a-->{n:1,x:undefined}
- a-->{n:1,x:undefined},b-->{n:1,x:undefined}
- 图解
- 依循“从右往左”的赋值运算顺序先执行 a={n:2} ,这时候,a指向的对象发生了改变,变成了新对象{n:2}。(可能你在这会有疑惑(重点),之前a不是指向了{n:1,x:undefined}吗,赋值不会影响他吗?原因是因为在执行(a.x=)的时候已经被挂起来等待赋值了,即使a发生了指向的变化,但也不再影响此刻的(a.x)了,因为已经对(a.x)进行了指向的确定,只不过他现在正在等待被赋值。a被重新赋值,此时a的指向也就变化了)
- a-->{n:2},b-->{n:1,x:undefined}
- 图解
- 继续执行 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}} )
- a-->{n:2},b-->{n:1,x:{n: 2}}
- 图解
- a中没有x,所以a.x=undefined,b.x={n: 2}
本文地址:https://blog.csdn.net/Web_J/article/details/107471318