function f() {
 return {} + {};
}
function g() {
 return {} + [];
}
var a = f();
var b = g();
a értéke helyesen "[object Object][object Object]" lesz, b értéke pedig megint csak helyesen "[object Object]".
Szóval itt igazából maga az eval() a ludas. És itt viszont bejön a parser működése, mert ugyebár az eval a paraméterében megkapott stringet parzolja mint Program
http://www.ecma-international.org/ecma-262/5.1/index.html#sec-15.1.2.1
A Program:
http://www.ecma-international.org/ecma-262/5.1/index.html#sec-14
Ez ugyebár Statementekből áll.
A Statement pedig lehet Block és Expression is.
http://www.ecma-international.org/ecma-262/5.1/index.html#sec-12
Viszont: "An ExpressionStatement cannot start with an opening curly brace because that might make it ambiguous with a Block."
Azaz így már egyértelmű, hogy {} + {} micsoda: attól függ, hogy Programként vagy értékkifejezésként tekintünk rá.
Azaz eval()-ban hajtatjuk végre, vagy mint blokk belsejében kifejezésként értékeljük ki.