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

时间:2014-10-13 19:19:11

标签: javascript node.js firebug

我正在阅读question(关于“wat”视频)的答案,并说:

  1. {}+[]
    这被解释为一个空的代码块,一元加和空数组。第一部分什么都不做,数组转换为逗号分隔的字符串(空数组为空数组),然后转换为数字(空字符串转换为0),因此为0。
  2. 我目前正在学习“权威指南”中的JS,所以我试着真正理解这样的事情。

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

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

    萤火虫:

    Firebug console output for <code>{}[]</code> and <code>({}[])</code>

    Node.js的:

    Node.js output for <code>{}[]</code> and <code>({}[])</code>

2 个答案:

答案 0 :(得分:21)

让我们看一下语言语法,好吗? Section 12, Statements

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

这是一种非常奇特的方式,可以说语句可以是块,变量语句,空语句,表达式语句或许多其他内容。请注意,第一个选项是&#39; Block&#39;:

Block :
    { StatementList(opt) }

StatementList :
    Statement
    StatementList Statement

这又是一种奇特的方式,表示一个块是{,可选地后跟一堆语句,然后是}

这就是你在你的例子中看到的内容:在JavaScript解析器认为你拥有的内容可能是一个对象文字(在ExpressionStatement下的某个地方定义)之前,第四个问题是&#39;声明&#39;可能是),它首先认为你有一个&#39; Block&#39;。

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

关于你的第二个问题,我们已经详细介绍了on this question。总结一句话:Node.js将您的输入视为表达式(因此它不能成为&#39; Block&#39;),而Firebug / Chrome开发工具将其视为&# 39;声明&#39;

答案 1 :(得分:2)

当新语句中的第一个标记为{时,{}将被解释为空块。

(当然,当{出现在ifwhile之类的标题子句之后,那么{}也是一个空块,但是&#39}不是有趣的案例。)

因此在任何其他情境中,比如说一个函数的参数:

foo({});

{}被解释为空对象文字。

这种情况类似于function关键字在语句中的第一件事被区别对待的方式。语法有歧义,解析器用固定规则解决问题。