JavaScript 代码技巧:foo.x 的值是什么 [英] JavaScript code trick: What's the value of foo.x

查看:34
本文介绍了JavaScript 代码技巧:foo.x 的值是什么的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在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 的值是对象{n:2}.

如果barfoo 指向同一个对象,为什么bar.x 得到一个值而foo.x 未定义 吗?foo.x = foo = {n: 2}; 到底发生了什么?

解决方案

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

确定foo.x引用{n: 1}对象的属性x,赋值{n:2}foo,并将foo的新值——{n:2}——赋给属性{n: 1} 对象的 x.

重要的是foo.x所指的foo是在foo改变之前确定的.

请参阅 ES5 规范的第 11.13.1 节:

<块引用>

  1. lref 成为评估 LeftHandSideExpression 的结果.

  2. rref 成为评估 AssignmentExpression 的结果.

赋值运算符从右到左关联,所以你得到:

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

左侧先于右侧求值.

I found this problem in a GitHub front-end interview questions collection:

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

Question: What is the value of foo.x?

The answer is undefined.

I've done some research and what I understand this problem is (correct me if I'm wrong):

  • var foo = {n: 1}; declares an object foo which has property n equal to 1.
  • var bar = foo; declares an object bar which refers to the same object as foo.
  • foo.x = foo = {n: 2}; which I believe is equal to foo.x = (foo = {n: 2});
  • And then I got foo.x equals to undefined. However, the value of bar.x is the object {n:2}.

If bar and foo refer to same object, why did bar.x get a value while foo.x is undefined? What is really happening in foo.x = foo = {n: 2};?

解决方案

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

determines that foo.x refers to a property x of the {n: 1} object, assigns {n: 2} to foo, and assigns the new value of foo{n: 2} – to the property x of the {n: 1} object.

The important thing is that the foo that foo.x refers to is determined before foo changes.

See section 11.13.1 of the ES5 spec:

  1. Let lref be the result of evaluating LeftHandSideExpression.

  2. Let rref be the result of evaluating AssignmentExpression.

The assignment operator associates right to left, so you get:

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

The left hand side is evaluated before the right hand side.

这篇关于JavaScript 代码技巧:foo.x 的值是什么的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆