【JS】连续赋值考题

前言

求打印结果

var a = { n: 1 }
var b = a
a.x = a = { n: 2 }

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

过程

1. var a = { n: 1 }

  • 创建了一个对象 { n: 1 } ,变量 a 保存了该对象的地址。

2. var b = a

  • 变量 b 被赋值为 ab 引用了和 a 相同的对象 { n: 1 }

3. a.x = a = { n: 2 }

这一步是最关键的,它包含了两次赋值操作,JS 赋值操作的顺序是从右到左的。

  • 首先执行右边的 a = { n: 2 }

    • 创建了一个新的对象 { n: 2 },此时 a 不再指向最初的 { n: 1 },而是指向新的对象 { n: 2 }
  • 然后执行 a.x = ...

    • 在赋值 a = { n: 2 } 之前,a 仍然指向最初的 { n: 1 } 对象,因此这一部分实际上是对原始对象 a(即 { n: 1 })的操作。
    • a.x = ... 这里的 a 仍然指向 { n: 1 },所以等效于:{ n: 1 }.x = { n: 2 },因此在旧的对象 { n: 1 } 上添加了一个属性 x,其值是 { n: 2 }

到这一步,内存中的对象情况如下:

  • a:指向 { n: 2 }(新对象)。
  • b:仍然指向 { n: 1, x: { n: 2 } }(旧对象)。

4. console.log(a.x)

  • 由于 a 现在已经是新的对象 { n: 2 },这个对象中并没有 x 属性,因此输出是 undefined

5. console.log(b.x)

  • b 仍然指向旧对象 { n: 1, x: { n: 2 } },并且在第三步中我们已经在该对象上设置了 x 属性,其值为 { n: 2 },所以输出是 { n: 2 }

总结:

  • a.x = a = { n: 2 } 中,赋值操作是从右向左的,先执行 a = { n: 2 },然后对旧对象 a(现在是 b 引用的对象)进行赋值 a.x = { n: 2 }
  • 因此,a 指向的新对象没有 x 属性,而 b 仍然指向旧对象,旧对象上有 x 属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

田本初

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值