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