我在GitHub前端面试问题集中发现了这个问题:
var foo = {n: 1}; var bar = foo; foo.x = foo = {n: 2}; 问题:foo.x的值是什么?
var foo = {n: 1}; var bar = foo; foo.x = foo = {n: 2};
问题:foo.x的值是什么?
答案是undefined。
undefined
我已经进行了一些研究,并且我理解这个问题(如果我错了,请纠正我):
var foo = {n: 1};
foo
n
var bar = foo;
bar
foo.x = foo = {n: 2};
foo.x = (foo = {n: 2});
foo.x
bar.x
{n:2}
如果bar和foo是指同一个对象,为什么bar.x得到的值,而foo.x为undefined?真正发生了foo.x = foo = {n: 2};什么?
判定foo.x是指一种属性x的的{n: 1}对象,受让人{n: 2}到foo,和受让人的新值foo- {n: 2}-为属性x的的{n: 1}对象。
x
{n: 1}
{n: 2}
重要的是,foo这foo.x指的是之前确定foo的变化。
参见ES5规范的11.13.1节
令 lref 为评估 LeftHandSideExpression 的结果。 令 rref 为评估 AssignmentExpression 的结果。
令 lref 为评估 LeftHandSideExpression 的结果。
令 rref 为评估 AssignmentExpression 的结果。
赋值运算符从右到左关联,因此您得到:
foo.x = (foo = {n: 2})
首先评估左侧,然后评估右侧。