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},这是为什么?谢谢
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},这是为什么?谢谢
拆解一下
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 } }
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
执行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}