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

cha*_*umQ 17 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.<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
Run Code Online (Sandbox Code Playgroud)

Poi*_*nty 21

当语句以...开头时{,解析器假定它是块语句的开头.在这种情况下{},它是一个块语句.所以就好像你有

{
  // no code here
}
|| []
Run Code Online (Sandbox Code Playgroud)

并且||不能发表声明.

确实有效的[] || {}是明确的,因为第一个令牌的语句[只能是表达式语句.

结束语{}( )表示该语句的第一个标志是(,没有{.该(令牌不能启动任何形式不是表达的其他语句(虽然它确实有一点含糊,因为它可以启动一个匿名的"胖箭头"的功能,这仍然是一个表达式解析器只是有后来的歧义).

注意:各种调试环境(如浏览器控制台和Node命令行"控制台")的实现会对这种语法产生影响.为了简单起见,这些工具会接受您键入的代码,并以某种方式"包装"它,以便可以在您键入时逐个语句地交互式地解析和评估它.不幸的是,这个过程会引入异常,这样你在控制台中尝试的东西可能在那里工作正常,但是当你在一个真正的代码块中尝试它时却不行.

  • @ExplosionPills这是特定于REPL在Chrome和Node中的工作方式,而不是其他任何内容. (6认同)
  • @ExplosionPills它在控制台中工作,但不是作为一个propper脚本.包裹`{} || 在`<script>`标签中{}`并在浏览器中运行它,你会得到错误.如果从脚本运行,节点也会抛出相同的错误.我猜控制台以神秘的方式工作,所以不能依赖它来判断这种行为. (4认同)
  • 在node和Chrome中,运行`{} || {}`返回`{}` (3认同)