Bien, esta es mi respuesta. No hay nada nuevo aquí. Acabo de vincular (una copia bonita de) la especificación ECMAScript para la gramática y mostrar algunas producciones para mostrar "por qué" analiza la forma en que lo hace. En cualquier caso, el comportamiento está bien definido de acuerdo con las reglas de la gramática Javascript/ECMAScript:. {}
se analice de manera diferente dependiendo del "contexto" que se encuentra en
Las JavaScript REPL s ("consolas") inicio para analizar el código en la producción de gramática Statement
o "contexto de declaración". (Esto es realmente una mentira, comienza en la producción Program
o SourceElements
, pero eso agrega construcciones adicionales para profundizar.) Aquí hay un desglose de gramática aproximada con simplificaciones y omisiones; ver el enlace anterior para obtener más:
Statement
Block
...
ExpressionStatement
Block
# This is actually { StatementList[optional] }, but this is what
# it amounts to: * means "0 or more".
{ Statement* }
ExpressionStatement
# An ExpressionStatement can't start with "{" or "function" as
# "{" starts a Block and "function" starts a FunctionStatement.
[lookahead ∉ {{, function}]Expression ;
Expression
# This is really PrimaryExpression; I skipped a few steps.
...
(Expression)
Por lo tanto (cuando está en "contexto comunicado"):
{}
-> Block # with no StatementList (or "0 statements")
-> Statement
Y:
({})
-> (Expression)
-> Expression
-> ExpressionStatement # omitted in productions below
-> Statement
Esto también explica por qué undefined === {}
un análisis sintáctico como EXPR === EXPR -> EXPR -> STMT
y resultados en falso cuando se evalúa. El {}
en este caso está en un "contexto de expresión".
En el caso de {} === undefined
se analiza como {}; === undefined
, o BLOCK; BOGUS -> STMT; BOGUS
, que es un error de sintaxis. Sin embargo, con la adición de paréntesis, esto cambia: ({} === undefined)
se analiza como (EXPR === EXPR) -> (EXPR) -> EXPR -> STMT
.
En el caso de {} + "hi"
se analiza como {}; + "hi"
, o BLOCK; + EXPR -> STMT; EXPR -> STMT; STMT
, que es una sintaxis válida a pesar de que es tonto (+
es unario en este caso). Del mismo modo, al igual que arriba, "hi" + {}
pone el {}
en un "contexto de expresión" y se analiza como EXPR + EXPR -> EXPR -> STMT
.
La consola de JavaScript solo muestra el resultado de la última instrucción, que es "indefinida" (bueno, "nada" en realidad, pero eso no existe) para un bloque vacío {}
. (Esto puede variar entre navegadores/entornos en cuanto a lo que se devuelve en este caso, por ejemplo, último ExpressionStatement solamente)
Happy coding.
... ¿Qué es f {INDEFECHIDO}? no es realmente tan apropiado. ¿Puedes reformular? –
Las consolas no necesariamente se asignan explícitamente a JS normales. Sé por ejemplo que (no recuerdo si esta era la consola de Chrome o FF) que si escribe '$ (id)' lo evaluaría como 'document '.getElementById (id) '(que se rompería con jQuery, por ejemplo). – Alxandr