我正在阅读 question 的答案(关于“wat”视频),它说:
{}+[]
这被解释为空代码块、一元加号和空数组。第一部分什么都不做,数组被转换为它的元素的逗号分隔字符串(空数组的空字符串),然后是一个数字(空字符串被转换为 0),因此为 0。
我目前正在从“权威指南”学习 JS,所以我尝试真正理解这样的事情。
我的问题是,JS 什么时候决定将 {}
解释为空代码块,而不是空对象?
此外,我想了解 Node.js 和 Firebug 之间的一些不一致之处。
Firebug :
Node.js:
最佳答案
让我们看看语言语法,好吗? Section 12, Statements :
Statement :
Block
VariableStatement
EmptyStatement
ExpressionStatement
...lots of other stuff...
这是一种非常奇特的说法,即语句可以是 block 、变量语句、空语句、表达式语句或许多其他东西。请注意,第一个选项有一个“阻止”:
Block :
{ StatementList(opt) }
StatementList :
Statement
StatementList Statement
这又是一种奇特的说法,一个 block 是一个{
,可选地后跟一堆语句,然后是一个}
。
这就是您在示例中看到的:在 JavaScript 解析器认为您所拥有的可能是对象文字(在 ExpressionStatement
下的某处定义之前,“语句”可能是第 4 件事),它首先认为你有一个“ block ”。
编辑:如果你愿意,你可以在 JavaScript 引擎的源代码中看到它:
- 在 Chrome 的 JavaScript 引擎 V8 中,我们进入
Parser::ParseStatement
. first thing it checks是我们是否在{
上,如果是,则解析为 block 。 - 在 Firefox 的 JavaScript 引擎 SpiderMonkey 中,我们从
Parser::statement
开始。再次看到the first check反对{
并将其解析为 block 语句。
关于您的第二个问题,我们已经详细介绍了 on this question .一句话总结:Node.js 将您的输入视为表达式(因此它不能是“ block ”),而 Firebug/Chrome 开发工具将其视为“语句”。
关于javascript - JS 什么时候将 {} 解释为空 block 而不是空对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26347326/