赋值运算符具有从右到左的关联性。所以
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
(循环引用)。有什么解释吗?
答案 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 }}