js连续赋值问题

js代码

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

我以为console.log(a.x)打印出来是{n:2},但实际是undefined,反而b.x正常显示为{n:2},这是为什么?谢谢

阅读 2.3k
3 个回答

执行a.x = a = {n:2}时可以表示为
a = {n:2} 这一步完成后a指向新的地址({n:2}的地址)
a.x = {n:2} 这一步,a仍然是原有的a(指向{n:1}地址的的a),赋值操作完成后,{n:1}->{n:1, x:{n:2}}, 新的a的地址不受影响,
所以此时,输出a.x, a指向{n:2}所以a.x为undefined;输出b.x, b依然指向{n:1, x:{n:2}}所以b.x为{n:2}

clipboard.png

其中AAAFFF000和BBBFFF000是假设存入的16进制地址,不一定是叫这个名字,但是是16进制的

拆解一下

var a
var b
a = {n:1} // a 指向 {n:1}
b = a // b 是指向了 a,即 b 指向了 {b:1}

a.x = a = {n:2} 
// 在 a 中添加多一个属性x, 且未赋值, 即{n:1} 变成了{n:1,x:null} 所以 b 也变成了 {n:1,x:null}
// 然后 a.x 即为 b.x, 然后 b.x 指向了 a 即 {n:1,x:a}
// 然后这时候 a 指向了一个新对象 {n:2} ,相当于指向了一块新的地方,但是b还是指向的是原对象即{n:1,x:{n:2}}

所以结果为

a => {n: 2}
b => {n: 1, x: {n: 2 } }  
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题