我正在阅读这个问题的答案(关于“wat”视频),它说:
{}+[]
这被解释为空代码块、一元加号和空数组。第一部分什么都不做,数组被转换为逗号分隔的元素字符串(空数组为空字符串),然后转换为数字(空字符串转换为 0),因此为 0。
我目前正在从“权威指南”中学习 JS,所以我试图真正理解这样的事情。
我的问题是,JS 什么时候决定解释{}
为一个空代码块,而不是一个空对象?
此外,我想了解 Node.js 和 Firebug 之间存在一些不一致之处。
萤火虫:
节点.js:
我正在阅读这个问题的答案(关于“wat”视频),它说:
{}+[]
我目前正在从“权威指南”中学习 JS,所以我试图真正理解这样的事情。
我的问题是,JS 什么时候决定解释{}
为一个空代码块,而不是一个空对象?
此外,我想了解 Node.js 和 Firebug 之间存在一些不一致之处。
萤火虫:
节点.js:
让我们看看语言语法,好吗?第 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
关键字作为语句中的第一件事时被区别对待的方式。语法有歧义,解析器用固定规则解决问题。