{} .toString()未捕获的SyntaxError:意外的令牌

时间:2016-09-22 15:49:45

标签: javascript tostring

当我在chrome dev工具中尝试时,它会显示出来 Uncaught SyntaxError: Unexpected token . 但是,如果它分配给 a

var a={}.toString(); 
a //[object Object]
是什么造成了这种差异?

4 个答案:

答案 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();