{}| |[]不是有效的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;}[]
无效。