为什么不能对象文字调用toCtring()方法如{} .toString()导致错误?

时间:2017-05-29 10:58:25

标签: javascript object-literal

当像toString()这样的对象文字调用方法会导致语法错误时,但是当数组文字调用{}.toString()时,它就可以了。当我将对象文字分配给变量时,那么当它调用toString()方法时就可以了。为什么?例如:

toString()

谢谢!

1 个答案:

答案 0 :(得分:8)

这是因为{}首先被视为有效块,而不是该上下文中的文字。

简单来说 - 考虑从左到右解释该行,遇到{因此期望块已经开始。当块结束时,它遇到.并且那里不允许使用该标识符。

如果您要使用({}).toString(),那将会有效。

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

如果在其他情境中使用{},例如在您的示例o = {}中,这被正确解释为空对象,因为它位于作业的右侧(=之后)。

请注意,在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