chrome - {} ||[] no es válido JavaScript
noscript chrome (1)
Cuando una declaración comienza con {
, el analizador asume que es el comienzo de una instrucción de bloque. En el caso de {}
, es una declaración de bloque vacía . Así que es como si tuvieras
{
// no code here
}
|| []
y ||
no se puede iniciar una declaración.
El que sí funciona, [] || {}
[] || {}
, es inequívoco porque una declaración cuyo primer token es [
solo puede ser una declaración de expresión.
Ajustar {}
en ( )
significa que el primer token de la declaración es (
, no {
. El (
token no puede iniciar ninguna forma de declaración que no sea una expresión (aunque tiene un poco de ambigüedad, ya que puede comenzar un "anónimo") Función de flecha ", que sigue siendo una expresión y el analizador solo tiene que desambiguar eso más adelante).
Nota: la implementación de varios entornos de depuración, como la consola del navegador y la "consola" de la línea de comandos de Node, tiene un efecto en este tipo de sintaxis. Para mantener las cosas simples, tales herramientas toman el código que usted ingresa y de una forma u otra lo "envuelven" para que pueda ser analizado y evaluado interactivamente, declaración por declaración a medida que escribe. Desafortunadamente, ese proceso puede introducir anomalías, de modo que algo que pruebe en la consola puede funcionar bien allí, pero no cuando lo intenta en un bloque de código real.
Esta pregunta ya tiene una respuesta aquí:
Porque es {} || []
{} || []
no válido?
$ echo ''[] || {}'' | node # this works
$ echo ''{} || []'' | node # but this doesn''t
[stdin]:1
{} || []
^^
SyntaxError: Unexpected token ||
at createScript (vm.js:80:10)
at Object.runInThisContext (vm.js:139:10)
at Object.<anonymous> ([stdin]-wrapper:6:22)
at Module._compile (module.js:652:30)
at evalScript (bootstrap_node.js:466:27)
at Socket.<anonymous> (bootstrap_node.js:237:15)
at emitNone (events.js:111:20)
at Socket.emit (events.js:208:7)
at endReadableNT (_stream_readable.js:1064:12)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
$ echo ''({}) || []'' | node # unless you do this