我正在阅读这个问题的答案(关于“wat”视频),它说:
{}+[]
这被解释为空代码块、一元加号和空数组。第一部分什么都不做,数组被转换为逗号分隔的元素字符串(空数组为空字符串),然后转换为数字(空字符串转换为 0),因此为 0。
我目前正在从“权威指南”中学习 JS,所以我试图真正理解这样的事情。
我的问题是,JS 什么时候决定解释{}为一个空代码块,而不是一个空对象?
此外,我想了解 Node.js 和 Firebug 之间存在一些不一致之处。
萤火虫:
![<code>{}[]</code> 和 <code>({}[])</code> 的 Firebug 控制台输出](https://i.stack.imgur.com/4JnaG.png)
节点.js:
![<code>{}[]</code> 和 <code>({}[])</code> 的 Node.js 输出](https://i.stack.imgur.com/KqbIH.png)
我正在阅读这个问题的答案(关于“wat”视频),它说:
{}+[]我目前正在从“权威指南”中学习 JS,所以我试图真正理解这样的事情。
我的问题是,JS 什么时候决定解释{}为一个空代码块,而不是一个空对象?
此外,我想了解 Node.js 和 Firebug 之间存在一些不一致之处。
萤火虫:
![<code>{}[]</code> 和 <code>({}[])</code> 的 Firebug 控制台输出](https://i.stack.imgur.com/4JnaG.png)
节点.js:
![<code>{}[]</code> 和 <code>({}[])</code> 的 Node.js 输出](https://i.stack.imgur.com/KqbIH.png)
让我们看看语言语法,好吗?第 12 节,声明:
Statement :
Block
VariableStatement
EmptyStatement
ExpressionStatement
...lots of other stuff...
这是一种非常奇特的说法,语句可以是块、变量语句、空语句、表达式语句或许多其他内容。请注意,第一个选项有一个“块”:
Block :
{ StatementList(opt) }
StatementList :
Statement
StatementList Statement
这又是一种奇特的说法,块是 a {,可选地后跟一堆语句,后跟 a }。
这就是您在示例中看到的内容:在 JavaScript 解析器认为您拥有的内容可能是一个对象字面量之前(在 下某处定义ExpressionStatement,“语句”可能是第 4 件事),它首先认为您有一个“块” '。
编辑:如果你愿意,你可以在 JavaScript 引擎的源代码中看到它:
Parser::ParseStatement. 它检查的第一件事是我们是否在 a 上{,如果是,则解析为块。Parser::statement再次看到第一个检查是针对 a{并将其解析为块语句。关于你的第二个问题,这个问题已经详细介绍了。用一句话总结:Node.js 将您的输入视为表达式(因此它不能是“块”),而 Firebug/Chrome 开发工具将其视为“语句”。
当新语句中的第一个标记是 时{,{}则被解释为一个空块。
(其实当然,当{出现后的像头条款if或者while,然后{}是一个空的块太大,但是这不是有趣的情况。)
因此,在任何其他上下文中,例如对函数说一个参数:
foo({});
the{}被解释为空对象字面量。
这种情况类似于function关键字作为语句中的第一件事时被区别对待的方式。语法有歧义,解析器用固定规则解决问题。