为什么直接调用对象字面量的默认方法会触发语法错误?
JavaScript 对象字面量调用方法的语法差异解释
首先看两个代码片段的表现:
- 可正常执行的写法:
({}).toString() // 返回 "[object Object]" - 抛出语法错误的写法:
{}.toString() // Uncaught SyntaxError: Unexpected token '.'
出现该差异的核心原因是JavaScript解析器的语法歧义优先级判定规则:
- 当解析器遇到行首位置的
{时,默认会优先将其识别为块语句的起始标记,而非对象字面量的起始符号。 - 对于
{}.toString()的写法,解析器会先把开头的{}判定为一个不包含任何执行语句的空代码块,块结束之后后续的.toString()就失去了调用主体,属于非法语法,因此直接抛出语法错误。 - 对于
({}).toString()的写法,外层的圆括号()会强制解析器将括号内部的内容判定为表达式,此时{}就会被正确识别为对象字面量,后续调用toString()方法完全符合语法规则,因此可以正常执行得到结果。
补充验证:你可以在浏览器控制台直接输入
{a: 1}执行,返回结果是数字1而非对象,本质也是同一个原因:{被识别为块开头,内部的a: 1被解析为带标签(标签名a)的表达式语句,最终返回表达式的结果1。
内容的提问来源于stack exchange,提问作者Eugene Mikhushkin
相关产品推荐
相关产品推荐

