,当我尝试在Chrome浏览器开发工具,它显示 Uncaught SyntaxError: Unexpected token .
但是,如果当它分配给一个:{}的ToString()未捕获的SyntaxError:意外的标记
var a={}.toString();
a //[object Object]
造成什么区别呢?
,当我尝试在Chrome浏览器开发工具,它显示 Uncaught SyntaxError: Unexpected token .
但是,如果当它分配给一个:{}的ToString()未捕获的SyntaxError:意外的标记
var a={}.toString();
a //[object Object]
造成什么区别呢?
如果您不在表达式上下文中(例如,在作业的右侧触发),那么{}
是a block statement而不是对象字面量。
解析器正在将{}
解释为代码块。你可以把它通过与周围括号中的括号正确解析:
({}).toString();
{}
被捕获第一和解释为一个块,其中有没有.toString
方法调用。
如果您将对象文字包装在parens中,如({}).toString()
,那么它将按预期工作。
这是因为解析规则优先级和{}
令牌被重载为对象和块定界符。
@TJCrowder固定(我正在编辑,但得到了浏览规范:()。 – ssube
哦,我从来没有这样做过; ;-) –
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
'({})的toString()' – Redu