2016-09-22 112 views

回答

2

如果您不在表达式上下文中(例如,在作业的右侧触发),那么{}a block statement而不是对象字面量。

0

解析器正在将{}解释为代码块。你可以把它通过与周围括号中的括号正确解析:

({}).toString(); 
1

{}被捕获第一和解释为一个块,其中有没有.toString方法调用。

如果您将对象文字包装在parens中,如({}).toString(),那么它将按预期工作。

这是因为解析规则优先级和{}令牌被重载为对象和块定界符。

+0

@TJCrowder固定(我正在编辑,但得到了浏览规范:()。 – ssube

+0

哦,我从来没有这样做过; ;-) –

3

what caused the difference?

解析器中,默认状态下,解析器在它需要一个声明的状态。因此,在您的控制台示例中,{看起来像是向其打开一个块,而不是对象初始值设定项的开始。 (你也可以把它在这一点上的表现,因为JavaScript有ExpressionStatement,这完全是由一个表达式的语句的概念。)

但在你var a={}.toString();代码中,{}.toString()出现在右边 - 分析器的一侧,解析器期望表达式,而不是语句。所以{启动一个对象初始值设定项。

如果你做一件让解析器期待的表情,相反,它会在控制台中工作过。

({}).toString(); // "[object Object]" 

+{}.toString(); // NaN, because the `+` tries to turn `[object Object]` into a number and fails 
相关问题