起因
今天刷题,遇到一道很坑的问题:
下面代码执行后,foo.x的值是?
var foo = {n:1};
var bar = foo;
foo.x = foo = {n:2};
这道题说实话我一开始也是懵的,没看懂,
这里还要吐槽为什么出题人总能想到这么奇葩的问题。
查了下资料,其实连续赋值问题很多人都讨论过(果然还是自己太嫩)
这里再贴一个网上讨论比较多的代码
var a = {n:1};
a.x = a = {n:2};
alert(a.x); // --> undefined
为什么a.x未定义?
我看了几篇博客后,觉得有一篇博客解释的很好
http://justjavac.com/javascript/2012/04/05/javascript-continuous-assignment-operator.html
里面是这样解释的:
a.x = a = {n:2};
a.x 中的a指向的是 {n:1},a 指向的是 {n:2}。
a.x = a = {n:2}
│ │
{n:1}<──┘ └─>{n:2}
其实看到这里已经算是解释清楚了,
但是有的同学就要问了,那有一个a确实有了x属性了啊!
所以我觉得还是要来最后一下,否则有一些像我一样迟钝的人还是没反应过来:
回到代码,
var a = {n:1};
a.x = a = {n:2};
alert(a.x); // --> undefined
第二行中,第一个a.x指向原来的a,第二个a被赋值为{n:2}
最后的情况如下:
旧的 a == {n:1,x:{n:2}};
新的 a == {n:2};
那么在第三行中,alert的a是哪个a?
答案应该是,第二个a,是新的a,新的a没有 x 属性,
所以alert的时候报了undefined。
回到开头,
下面代码执行后,foo.x的值是?
var foo = {n:1};
var bar = foo;
foo.x = foo = {n:2};
答案应该是 undefined
这里,第一个foo.x还是原来的foo
第二个foo,是新的foo,这个新的foo没有x 属性
所以执行后,foo.x找到的是新的foo,不会找原来的foo,而是找的新的foo,新的foo没有x属性,所以是undefined。