温故知新(一)let a = {n:1}; let b = a; a.x = a = {n:2};console.log(a.x); console.log(b.x)

探讨JavaScript中对象引用的特性,通过实例演示对象属性赋值过程中的引用变化及执行结果,深入理解变量、对象与属性之间的关系。

说明:题目来自于网络搜集查找,自己仅作收集归纳整理,谢谢

描述:写出执行结果,并解释为什么

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

答案:

undefined 

{n:2}

知识点:

  1. 点的优先级大于等号的优先级
  2. 对象以指针的形势进行存储,每个新对象都是一份新的存储地址

解析:

  • let b = a ; b 和 a 都指向同一个地址
  • . 的优先级高于 =  。所以先执行 a.x ,于是现在的 a 和 b 都是 { n : 2 , x : undefined }
  • = 从右向左执行。所以是执行 a = { n : 2 },于是 a 指向了 { n : 2 } 不再是之前的地址
  • 再执行 a.x = a。这里注意,a.x 是最开始执行的(可以看作是一个整体),已经是 { n : 1 , x : undefined } 而不是一开始的那个 a ,而且 b 和旧的 a 是指向同一个地址的,相当于b.x = a 。所以 b 也就变了
  • 但是,= 右边的 a 是已经指向了新地址的 a 。
  • 所以,a.x = a 可以看成是 { n : 1, x : undefined }.x = { n : 2 }

最终得出:

a = {n:2}
b = {
    n:1,
    x:{n:2}
}

图解:

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值