( persicsb | 2016. 05. 18., sze – 23:41 )


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.