{}| |[]不是有效的JavaScript

{}| |[]不是有效的JavaScript,javascript,node.js,Javascript,Node.js,为什么{}|[]无效 $ 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.<

为什么
{}|[]
无效

$ 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
$echo'[]| |{}'|节点#这很有效
$echo'{}| |[]节点|但这不是
[stdin]:1
{} || []
^^
SyntaxError:意外标记||
在createScript上(vm.js:80:10)
在Object.runInThisContext(vm.js:139:10)
反对。([stdin]-包装:6:22)
编译(Module.js:652:30)
在evalScript(bootstrap_node.js:466:27)
在插座上。(bootstrap_node.js:237:15)
在emitNone(events.js:111:20)
在Socket.emit(events.js:208:7)
在endReadableNT(_stream_readable.js:1064:12)
at _combinedTickCallback(内部/流程/下一步_tick.js:138:11)
$echo“({})| |[]”| node#除非执行此操作

当语句以
{
开头时,解析器假定它是块语句的开头。在
{}
的情况下,它是一个空块语句。因此,就好像

{
  // no code here
}
|| []
|
无法启动语句

真正起作用的语句,
[]|{}
是明确的,因为第一个标记为
[
的语句只能是表达式语句

{}
包装在
()
中意味着语句的第一个标记是
,而不是
{
标记不能启动表达式以外的任何形式的语句(尽管它确实有点模糊,因为它可以启动匿名“胖箭头”)函数;这仍然是一个表达式,解析器稍后只需消除歧义)


注意:各种调试环境(如浏览器控制台和节点命令行“控制台”)的实现会对这种语法产生影响。为了保持简单,这些工具会接受您键入的代码,并以某种方式“包装”不幸的是,这个过程可能会引入异常,这样你在控制台中尝试的东西可能在那里工作得很好,但当你在一个真正的代码块中尝试它时就不行了。

block statement对我来说,这并不能解释为什么
{}{124;{}
是允许的。在node和Chrome中,运行
{}}{124;{}
返回
{}
@ExplosionPills,它在控制台中工作,但不作为propper脚本。Wrap
{}}
在一个
标记中,然后在浏览器中运行它,你会得到错误。如果从脚本运行,Node也会抛出相同的错误。我猜控制台的工作方式很神秘,因此不能依靠它来判断这种行为。@ExplosionPills这是特定于REPL在Chrome和Node中的工作方式,而不是其他任何东西。@devtools中的estus,而不是b因为它是有效的语法。而且黑客只对一个
{}{}}{}{}
有效,而对
{}}}}{124;}[]
无效。