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

标签 javascript node.js firebug

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

  1. {}+[]
    这被解释为空代码块、一元加号和空数组。第一部分什么都不做,数组被转换为它的元素的逗号分隔字符串(空数组的空字符串),然后是一个数字(空字符串被转换为 0),因此为 0。

我目前正在从“权威指南”学习 JS,所以我尝试真正理解这样的事情。

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

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

Firebug :

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

Node.js:

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

最佳答案

让我们看看语言语法,好吗? 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 引擎的源代码中看到它:

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

关于javascript - JS 什么时候将 {} 解释为空 block 而不是空对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26347326/

相关文章:

javascript - Firebug 不显示 ajax 请求

javascript - 在选项卡而不是窗口中打开

javascript - 'var' 未在 npm 中定义为内部或外部命令

node.js - 获取包含特定文件nodejs的所有第一个子文件夹

node.js - 向 Github API 发出创建问题的 Post 请求不起作用

firebug - Firebug net 选项卡中的红色文本是什么意思?

javascript - 获取由 ng-repeat | 填充的输入的编辑值 Angular js

javascript - Socket.IO ERR_CONNECTION_REFUSED

javascript - 如何从 Angular 中的 ng-repeat 获取输入值

java - 在没有html firebug扩展的javascript中调用java方法