一尘不染

JavaScript代码技巧:foo.x的值是什么

javascript

我在GitHub前端面试问题集中发现了这个问题:

var foo = {n: 1};
var bar = foo;
foo.x = foo = {n: 2};

问题:foo.x的值是什么?

答案是undefined

我已经进行了一些研究,并且我理解这个问题(如果我错了,请纠正我):

  • var foo = {n: 1};声明一个foo属性n等于1 的对象。
  • var bar = foo;声明一个对象bar,该对象引用与相同的对象foo
  • foo.x = foo = {n: 2}; 我相信等于 foo.x = (foo = {n: 2});
  • 然后我foo.x等于undefined。但是,的值bar.x是object {n:2}

如果barfoo是指同一个对象,为什么bar.x得到的值,而foo.xundefined?真正发生了foo.x = foo = {n: 2};什么?


阅读 409

收藏
2020-05-01

共1个答案

一尘不染

foo.x = foo = {n: 2};

判定foo.x是指一种属性x的的{n: 1}对象,受让人{n: 2}foo,和受让人的新值foo- {n: 2}-为属性x的的{n: 1}对象。

重要的是,foofoo.x指的是之前确定foo的变化。

参见ES5规范的11.13.1节

  1. lref 为评估 LeftHandSideExpression 的结果。

  2. rref 为评估 AssignmentExpression 的结果。

赋值运算符从右到左关联,因此您得到:

foo.x = (foo = {n: 2})

首先评估左侧,然后评估右侧。

2020-05-01