当我在chrome dev工具中尝试时,它会显示出来
Uncaught SyntaxError: Unexpected token .
但是,如果它分配给 a :
var a={}.toString();
a //[object Object]
是什么造成了这种差异?
答案 0 :(得分:3)
是什么造成了这种差异?
解析器所处的状态。默认情况下,解析器处于需要语句的状态。因此,在控制台的示例中,{
看起来像是打开一个块,而不是对象初始化程序的开头。 (此时您也可以给它一个表达式,因为JavaScript具有 ExpressionStatement 的概念,它是一个完全由表达式组成的语句。)
但是在var a={}.toString();
代码中,{}.toString()
出现在分配的右侧,解析器需要表达式,而不是语句。所以{
启动了一个对象初始化器。
如果你做了一些事情来使解析器期望一个表达式,它也会在控制台中工作:
({}).toString(); // "[object Object]"
或
+{}.toString(); // NaN, because the `+` tries to turn `[object Object]` into a number and fails
答案 1 :(得分:2)
如果您不在表达式上下文中(例如,由于在作业的右侧触发),那么{}
是a block statement而不是对象文字。< / p>
答案 2 :(得分:1)
{}
并将其解释为一个块,没有.toString
方法可以调用。
如果将对象文字包装在parens中,例如({}).toString()
,那么它会按预期工作。
这是因为解析规则优先级和{}
标记被重载为对象和块分隔符。
答案 3 :(得分:0)
解析器将{}
解释为代码块。您可以通过用括号括起大括号来正确解析:
({}).toString();