作业关联性

时间:2016-06-11 11:18:35

标签: javascript

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

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(循环引用)。有什么解释吗?

1 个答案:

答案 0 :(得分: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中,然后将相同的值分配给x的旧内容的属性foo ...我们可以通过查看bar

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