一尘不染

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

node.js

我正在阅读此问题的答案(关于“ wat”视频),它说:

  1. {}+[]
    这被解释为空的代码块,一元加号和空数组。第一部分不执行任何操作,将数组转换为其元素的逗号分隔字符串(用于空数组的空字符串),然后转换为数字(将空字符串转换为0),因此为0。

我目前正在从“权威指南”中学习JS,因此我试图真正理解类似的东西。

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

另外,我想理解Node.js和Firebug之间存在一些不一致之处。

萤火虫:

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

Node.js:

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


阅读 230

收藏
2020-07-07

共1个答案

一尘不染

让我们看一下语言语法,对吧?第12节,声明

Statement :
    Block
    VariableStatement
    EmptyStatement
    ExpressionStatement
    ...lots of other stuff...

这是一种非常奇特的说法,一个语句可以是一个块,一个变量语句,一个空语句,一个表达式语句或许多其他内容。请注意,第一个选项是“阻止”:

Block :
    { StatementList(opt) }

StatementList :
    Statement
    StatementList Statement

同样,这是一种怪异的说法,即一个块是a {,可选地后面是一堆语句,然后是a }

这就是您在示例中看到的结果:在JavaScript解析器认为您所拥有的可能是对象文字(在ExpressionStatement“声明”可能位于的第4项下定义)之前,它首先认为您拥有“阻止”
‘。

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

关于第二个问题,这个问题。总结一下:Node.js将您的输入视为一个表达式(因此不能是“块”),而Firebug
/ Chrome开发人员工具则将其视为“语句”。

2020-07-07