我在一个GitHub前端面试问题集中发现了这个问题:
var
= {n: 1};var bar = foo;foo.x = foo = {n: 2};
问: foo.x的价值是什么?
答案是undefined
。
我做了一些研究,我对这个问题的理解是(如果我错了,请纠正我):
var foo = {n: 1};
声明了一个属性为1.var bar = foo;
的对象n
,声明了一个引用与foo.x = (foo = {n: 2});
bar
,我相信它等于foo
,然后我得到了n
等于bar
。但是,对象{n:2}
.为bar.x
的值
如果bar
和foo
引用了同一个对象,为什么bar.x
会得到一个值,而foo.x
却是undefined
?foo.x = foo = {n: 2};
中到底发生了什么
发布于 2015-09-02 08:23:47
foo.x = foo = {n: 2};
确定foo.x
引用{n: 1}
对象的属性x
,将{n: 2}
分配给foo
,并将新值foo
- {n: 2}
-分配给{n: 1}
对象的属性x
。
重要的是,foo.x
引用的foo
是在foo
更改之前确定的。
请参阅section 11.13.1 of the ES5 spec
rref是AssignmentExpression.的求值结果,LeftHandSideExpression.
赋值运算符从右到左关联,因此您可以得到:
foo.x = (foo = {n: 2})
左手边在右手边之前求值。
发布于 2016-07-18 22:09:19
foo.x = foo = {n: 2};
在这里,foo
指的是赋值之前,即语句执行之前的{n:1}
对象。
该语句可以重写为foo.x = (foo = {n:2});
就对象而言,上面的语句可以重写为{n:1}.x = ( {n:1} = {n:2} );
因为赋值只从右到左发生。所以在这里,我们只需要在开始执行之前检查一下foo
引用的是哪个对象。
关于解决R.H.S:foo = {n:2};
现在foo
指的是{n:2};
回到我们剩下的问题上:
foo.x = foo;
现在L.H.S上的foo.x
仍然是{n:1}.x
,而R.H.S上的foo
是{n:2}
。
因此,在执行此语句后,{n:1}
将变为{ n:1, x:{n:2} }
,但bar仍会引用它。其中as foo
现在将引用{n:2}
。
因此在执行时,foo.x
会给出undefined
,因为在foo
中只有一个值,即{n:2}
。
但是如果你尝试执行bar.x
,它会给出{n:2}
。或者,如果只执行bar
,结果将是
Object {n: 1, x: Object}
发布于 2018-07-19 15:59:23
根据我对表达式的理解:
foo.x = foo = {n: 2};
完全相同的是:
foo.x = {n: 2} ;
foo = {n: 2};
在这之后,很明显的是:
bar=={n: 1, x: {n:2}};
foo=={n:2};
foo.x==undefined
https://stackoverflow.com/questions/32342809
复制相似问题