Javascript JS何时将{}解释为空块而不是空对象?
我读到了答案(关于“wat”视频),它说:Javascript JS何时将{}解释为空块而不是空对象?,javascript,node.js,firebug,Javascript,Node.js,Firebug,我读到了答案(关于“wat”视频),它说: {}+[] 这被解释为一个空代码块、一元加号和空数组。第一部分什么也不做,数组被转换成以逗号分隔的元素字符串(空数组为空字符串),然后转换成一个数字(空字符串被转换成0),因此为0 我目前正在从《权威指南》学习JS,所以我试图真正理解类似的东西 我的问题是,JS何时决定将{}解释为空代码块,而不是空对象 另外,Node.js和Firebug之间存在一些不一致之处,我想了解一下 萤火虫: {}[]和({}[])“> Node.js: {}[]和({}[]
{}+[]
这被解释为一个空代码块、一元加号和空数组。第一部分什么也不做,数组被转换成以逗号分隔的元素字符串(空数组为空字符串),然后转换成一个数字(空字符串被转换成0),因此为0
{}
解释为空代码块,而不是空对象
另外,Node.js和Firebug之间存在一些不一致之处,我想了解一下
萤火虫:
{}[]和({}[])
“>
Node.js:
{}[]和
({}[])
“>当新语句中的第一个标记是{
,则{}
被解释为空块
(实际上,当{
出现在类似的头子句后面时,如果或while
,那么{}
也是一个空块,但这不是有趣的情况。)
因此,在任何其他上下文中,比如说函数的参数:
foo({});
{}
被解释为空对象文本
这种情况类似于函数
关键字作为语句中的第一项时被区别对待的方式。语法有歧义,解析器用固定的规则解决问题。让我们看看语言语法,好吗?:
这是一种非常奇特的说法,语句可以是块、变量语句、空语句、表达式语句或许多其他内容。请注意,第一个选项是“块”:
Block :
{ StatementList(opt) }
StatementList :
Statement
StatementList Statement
这也是说块是一个{
,可选地后跟一组语句,后跟一个}
这就是您在示例中看到的:在JavaScript解析器认为您拥有的可能是对象文字(在ExpressionStatement
下定义,这是“Statement”可能是的第四个东西)之前,它首先认为您拥有一个“Block”
编辑:如果您愿意,您可以在JavaScript引擎的源代码中看到它:
- 在Chrome的JavaScript引擎V8中,我们进入。问题是我们是否在
{
上,如果在{
上,则解析为块
- 在Firefox的JavaScript引擎SpiderMonkey中,我们从一个到另一个看到反对
{
并将其解析为块语句
关于你的第二个问题,我们已经非常详细地讨论过了。总结一句话:Node.js将你的输入视为一个表达式(因此它不能是一个“块”),而Firebug/Chrome开发工具将其视为“语句”。如何解释第一个Node.js示例?谢谢!@EllaShar我对Node不太熟悉,但它基本上只是将您键入的字符串传递给eval()
,但它以某种方式改变了语法上下文。如果您键入;{}+[]
在节点中,然后你会得到0
就像在Firebug中一样。我认为这不是重复,因为它明确地引用了另一个问题并询问了一个细节。@Pointy-它引用了一个不同的问题。链接的问题清楚地解释了行为。正如重复中所指出的,[]和{}都转换为它们的基元值。.join
在空数组上是一个空字符串。toString.call({})是“[Object Object]”。表达式导致连接,例如(“1”+0)=10或“[Object Object]”“+”=“[Object Object]””@TravisJ我同意这是一个关于它是否真的是一个复制品的意见问题。我对复制品没有太大的问题,但我理解如果你对它有强烈的感觉,其他人也会这么做。去吧,把它关上,我不会碰它:)@TravisJ我也不知道我有上帝般的力量,可以不经表决就重新打开:)我认为这是不对的t节点REPL将输入视为一个表达式-例如,您可以在REPL中键入一个for
循环。这就是摘要出现在句子中的原因。Benjamin Gruenbaum的回答更详细:REPL首先尝试将其作为表达式执行,如果抛出一个语法错误,它将直接执行eval
。为什么?sh我现在看到了rugOK-Node显式地检查对象文本的大小写(前导{
)。我不认为我会这样做(最基本的是不让人惊讶)但不管怎样。谢谢你有趣的引用!我仍然不明白Node.js示例中的分号为什么重要。好吧,表达式中不允许使用分号,因此它不能作为表达式计算,而只能作为语句计算。
Block :
{ StatementList(opt) }
StatementList :
Statement
StatementList Statement