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

zhe*_*oli 1 javascript object-literal

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

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

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

谢谢!

Ovi*_*lha 9

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

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

如果您使用({}).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
Run Code Online (Sandbox Code Playgroud)

  • [分组](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)比[member access](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_Accessors#Dot_notation). (2认同)