Ok, ecco la mia risposta. Non c'è nulla di nuovo qui. Sto solo collegando (una bella copia di) le specifiche ECMAScript per la grammatica e mostrando alcune produzioni per mostrare "perché" analizza il modo in cui funziona. In ogni caso, il comportamento è ben definito secondo le regole grammaticali JavaScript/ECMAScript:. {}
viene analizzato in modo diverso a seconda del "contesto" è in
Le JavaScript REPL S ("console") inizio per analizzare il codice nella produzione di grammatica Statement
o "contesto di istruzione". (Questa è in realtà una bugia, inizia dalla produzione Program
o SourceElements
, ma aggiunge ulteriori costrutti da scavare.) Ecco una ripartizione grammaticale approssimativa con semplificazioni e omissioni; vedi il link qui sopra per più:
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)
Così (quando nel "contesto dichiarazione"):
{}
-> Block # with no StatementList (or "0 statements")
-> Statement
E:
({})
-> (Expression)
-> Expression
-> ExpressionStatement # omitted in productions below
-> Statement
Questo spiega anche perché undefined === {}
analizza come EXPR === EXPR -> EXPR -> STMT
e risultati in falso quando valutato. Lo {}
in questo caso è in un "contesto di espressione".
Nel caso di {} === undefined
viene analizzato come {}; === undefined
o BLOCK; BOGUS -> STMT; BOGUS
, che è un Errore di sintassi. Tuttavia, con l'aggiunta di parentesi questo cambia: ({} === undefined)
viene analizzato come (EXPR === EXPR) -> (EXPR) -> EXPR -> STMT
.
Nel caso di {} + "hi"
viene analizzato come {}; + "hi"
o BLOCK; + EXPR -> STMT; EXPR -> STMT; STMT
, che è sintassi valida anche se è stupido (+
è unario in questo caso). Allo stesso modo, come sopra, "hi" + {}
inserisce lo {}
in un "contesto di espressione" e viene analizzato come EXPR + EXPR -> EXPR -> STMT
.
La console JavaScript mostra solo il risultato dell'ultima istruzione, che è "non definita" (beh, "nulla" in realtà, ma non esiste) per un blocco vuoto {}
. (Ciò potrebbe variare tra browser/ambienti e ciò che viene restituito in questo caso, ad esempio solo l'ultimo ExpressionStatement?)
Felice codifica.
... Che cosa f {UNDEFINED}? non è proprio appropriato. Puoi riformulare? –
Le console non si associano necessariamente al JS normale. So per esempio che (non ricordo se questa fosse la chrome o la console FF) che se si digita '$ (id)' si valuterà 'documento.getElementById (id) '(che romperebbe con jQuery per esempio). – Alxandr