2017-05-29 31 views
0

当对象文字调用toString(){}.toString()这样的方法将导致语法错误,但是当数组文字调用toString()它是确定的。而当我将对象文字赋值给一个变量时,那么当它调用toString()方法时就OK了。为什么?例如:为什么不能像{} .toString()这样的对象直接调用toString()方法导致错误?

var o = {}; 
o.toString(); // OK 

{}.toString(); 
// > Uncaught SyntaxError: Unexpected token . 
[1, 2, 3].toString(); // OK 

谢谢!

回答

8

这是因为{}被视为第一个有效的块,而不是在该上下文中的文字。

简而言之 - 考虑从左到右解释该行,遇到{,因此预计块已经启动。当该块结束时,它遇到.,并且该标识符不允许在那里。

如果您要使用({}).toString()那将起作用。

这是因为该行以(开头,因此需要一个表达式,它将{}正确标识为表达式,该表达式被评估为空对象,因此允许使用'.toString()'。

如果在另一上下文中使用{},在你的示例o = {}中,这被正确解释为一个空对象,因为is在作业的右侧(在=之后)。

请注意,在ES6中有一个类似但更常见/实际的情况,在这种情况下,理解这一点非常重要 - 当以单线箭头函数返回对象时,例如

[1,2,3,4].map(val => { v: val, isOdd: v % 2 === 1 }) // ERROR 
[1,2,3,4].map(val => ({ v: val, isOdd: v % 2 === 1 })) // OK 
+0

好答案!你能否详细解释它,为什么会发生这种情况?谢谢。 – zhenguoli

+2

[分组](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Grouping)具有较高的[优先级](https://developer.mozilla.org/en/ docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table)而不是[成员访问](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_Accessors#Dot_notation)。 –

相关问题