为什么不能像{} .toString()这样的对象直接调用toString()方法导致错误?
问题描述:
当对象文字调用toString()
像{}.toString()
这样的方法将导致语法错误,但是当数组文字调用toString()
它是确定的。而当我将对象文字赋值给一个变量时,那么当它调用toString()
方法时就OK了。为什么?例如:为什么不能像{} .toString()这样的对象直接调用toString()方法导致错误?
var o = {};
o.toString(); // OK
{}.toString();
// > Uncaught SyntaxError: Unexpected token .
[1, 2, 3].toString(); // OK
谢谢!
答
这是因为{}
被视为第一个有效的块,而不是在该上下文中的文字。
简而言之 - 考虑从左到右解释该行,遇到{
,因此预计块已经启动。当该块结束时,它遇到.
,并且该标识符不允许在那里。
如果您要使用({}).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
好答案!你能否详细解释它,为什么会发生这种情况?谢谢。 – zhenguoli
[分组](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)。 –