首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaScript代码技巧: foo.x的值是什么

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

Stack Overflow用户
提问于 2015-09-02 08:16:30
回答 6查看 10.3K关注 0票数 57

我在一个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});
  • And相同的对象的对象bar,我相信它等于foo,然后我得到了n等于bar。但是,对象{n:2}.

bar.x的值

如果barfoo引用了同一个对象,为什么bar.x会得到一个值,而foo.x却是undefinedfoo.x = foo = {n: 2};中到底发生了什么

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-09-02 08:23:47

代码语言:javascript
复制
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.

  • Let是
  1. 的求值结果

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

代码语言:javascript
复制
foo.x = (foo = {n: 2})

左手边在右手边之前求值。

票数 58
EN

Stack Overflow用户

发布于 2016-07-18 22:09:19

代码语言:javascript
复制
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};

回到我们剩下的问题上:

代码语言:javascript
复制
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,结果将是

代码语言:javascript
复制
Object {n: 1, x: Object}
票数 24
EN

Stack Overflow用户

发布于 2018-07-19 15:59:23

根据我对表达式的理解:

代码语言:javascript
复制
foo.x = foo = {n: 2};

完全相同的是:

代码语言:javascript
复制
foo.x = {n: 2} ; 
foo = {n: 2};

在这之后,很明显的是:

代码语言:javascript
复制
 bar=={n: 1, x: {n:2}};
 foo=={n:2};
 foo.x==undefined
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32342809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档