【奇怪的输出题】对象引用的问题

题目如下:

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

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

答案是:

undefined
{n:2}

解析:

首先:ab同时引用了{n:2}对象
然后执行a.x = a = {n: 2}语句,尽管赋值是从右到左的
.的优先级比=高,所以这里会先执行a.x,相当于为a所指向的对象{n:1}新增了一个属性x

然后执行a={n:2},相当于改变了a的指向,a不再指向对象{n:1},而是指向新对象{n:2}

而此时b的对象指向时没有改变的,还是指向{n:1}

之后执行a.x={n:2},这里并不会重新解析一遍a,也就是会继续沿用最初解析a.x时的a,也就是指向{n:1}a

因此,旧对象中的x的属性值指向新对象{n:2},此时整个旧对象为{n:1,x:{n:2}},而整个旧对象它只是被b引用着

所以后面输出a.x时,又要解析a,而此时a是指向新对象{n:2}的,而这个新对象里没有x属性,所以访问时输出undefined

而访问b.x时,将会输出旧对象的x值,也就是说{n:2}

请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值