什么时候JS将{}解释为空块而不是空对象?

Ell*_*ski 17 javascript firebug node.js

我正在阅读这个问题的答案(关于"wat"视频),它说:

  1. {}+[]
    这被解释为一个空的代码块,一元加和空数组.第一部分什么都不做,数组转换为逗号分隔的字符串(空数组为空数组),然后转换为数字(空字符串转换为0),因此为0.

我目前正在从"权威指南"学习JS,所以我试着真正理解这样的事情.

我的问题是,JS何时决定将其解释{}为空代码块,而不是空对象?

另外,我想了解Node.js和Firebug之间的一些不一致之处.

萤火虫:

用于<code> {} [] </ code>和<code>({} [])</ code>的Firebug控制台输出

Node.js的:

<code> {} [] </ code>和<code>({} [])</ code>的Node.js输出

Zir*_*rak 22

我们来看看语言语法吧?第12节,声明:

Statement :
    Block
    VariableStatement
    EmptyStatement
    ExpressionStatement
    ...lots of other stuff...
Run Code Online (Sandbox Code Playgroud)

这是一种非常奇特的方式,可以说语句可以是块,变量语句,空语句,表达式语句或许多其他东西.请注意,第一个选项是"Block":

Block :
    { StatementList(opt) }

StatementList :
    Statement
    StatementList Statement
Run Code Online (Sandbox Code Playgroud)

再一次,这是一种奇特的方式,说一个块是一个{,可选地后跟一堆语句,然后是一个}.

这就是你在你的例子中看到的:在JavaScript解析器认为你拥有的东西可能是一个对象文字(在某个地方定义ExpressionStatement,第四个是'Statement'可能是)之前,它首先认为你有一个'Block ".

编辑:如果需要,您可以在JavaScript引擎的源代码中看到它:

关于你的第二个问题,关于这个问题已经详细介绍.总结一句话:Node.js将您的输入视为表达式(因此它不能是"阻止"),而Firebug/Chrome开发工具将其视为"语句".