Strange things are happening here in the assignments:
foo.c = (foo = {})
The reference to foo.c
is resolved first and points to the old foo
object, before the inner expression is evaluated where foo
is re-assigned with the {}
emtpy object literal. So your code is equivalent to
var foo1 = {};
var foo2 = {};
foo1.c = foo2;
console.log(foo2.c) // obviously undefined now
You can also try
var foo = {}, old = foo;
foo.c = foo = {};
console.log(old, foo, old.c===foo); // {c:{}}, {}, true
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…