var foo = {};
foo.c = foo = {};
console.log(foo.c);
为什么结果未定义? 我以为它应该是'[object Object]'
答案 0 :(得分:11)
assignments中发生了奇怪的事情:
foo.c = (foo = {})
在评估内部表达式foo.c
之前,首先解析reference到foo
并指向旧 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以获取更多详细信息 - 这主要是为什么您的代码行为不像预期的那样,因为最初的期望是基于错误的假设