2016-06-11 90 views
4

赋值运算符具有从右到左的关联性。所以赋值关联性

var x,y; 
x=y=1; 

按预期工作和x等于1.现在考虑的代码:

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

我希望上述类似下面的工作:

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

然而,在第一种情况foo.x为undefined,而第二种情况为foo.x points to foo(循环参考)。任何解释?

回答

5

JavaScript从左向右评估表达式。我们可以证明这是怎么回事,通过使用一个额外的变量:

var foo = {}; 
var bar = foo; // keep a reference to the object originally stored in foo 
foo.x = foo = {n: 2}; 

由于关联的,最后一个语句被解析为:

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

但由于评估顺序,foo.x运行第一(确定在哪里存储该值),然后foo,然后{n: 2}。所以我们存储{n: 2}在变量foo,则相同的值分配给的旧内容的foo ...我们可以通过查看bar查看属性x

foo = {"n" : 2} 
bar = {"x" : {"n" : 2 }} 
+0

任何引用来支持声称转让表达式从左到右进行评估? – haim770

+0

@ haim770在http://www.ecma-international.org/ecma-262/6.0/中,我发现“* ECMAScript指定从左到右评估表达式*”。 – melpomene