为什么程序的结果未定义?

时间:2014-02-24 05:00:16

标签: javascript

 var foo = {};
 foo.c = foo = {};
 console.log(foo.c);

为什么结果未定义? 我以为它应该是'[object Object]'

2 个答案:

答案 0 :(得分:11)

assignments中发生了奇怪的事情:

foo.c = (foo = {})

在评估内部表达式foo.c之前,首先解析referencefoo并指向 foo对象使用{} emtpy对象文字重新分配。所以你的代码相当于

var foo1 = {};
var foo2 = {};
foo1.c = foo2;
console.log(foo2.c) // obviously undefined now

您也可以尝试

var foo = {}, old = foo;
foo.c = foo = {};
console.log(old, foo, old.c===foo); // {c:{}}, {}, true

答案 1 :(得分:0)

JavaScript引擎拆分了这样的赋值:

a = b = c = 1;

如下:

a = 1;
b = 1;
c = 1;

并且为:

c = 1;
b = c;
a = b;

有一个稍微但重要的区别 - 主要是,它涉及到getter,请查看Multiple variable assignments in one row以获取更多详细信息 - 这主要是为什么您的代码行为不像预期的那样,因为最初的期望是基于错误的假设