{} || [] недействителен JavaScript

Почему {} || [] {} || [] Недействительно?

$ 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

Ответ 1

Когда оператор начинается с {, он считает, что синтаксический анализатор является началом блока. В случае {} это пустой оператор блока. Так, как будто вы

{
  // no code here
}
|| []

и || не может начинать утверждение.

Тот, который работает, [] || {} [] || {}, недвусмыслен, потому что оператор, чей первый токен [ может быть только выражением выражения.

Обертка {} in ( ) означает, что первый токен инструкции равен (, а не {. ( Токен не может начинать какую-либо форму выражения, отличную от выражения (хотя он имеет небольшую двусмысленность, поскольку он может запускать анонимный "жир" стрелка ", что все еще выражение и парсер просто должны устранить это позже).

Примечание. Реализация различных сред отладки, таких как консоль вашего браузера и консоль командной строки узла, влияет на этот тип синтаксиса. Чтобы упростить задачу, такие инструменты используют код, который вы вводите, и так или иначе они "обертывают" его, чтобы он мог анализироваться и оцениваться в интерактивном режиме, выставлять оператор по типу. К сожалению, этот процесс может привести к аномалиям, так что что-то, что вы пытаетесь использовать в консоли, может работать нормально, но не при попытке использовать его в реальном блоке кода.