JavaScript 语法:语法上禁止索引对象文字?

JavaScript grammar: indexing object literals syntactically forbidden?

在 Chrome 63.0 和 Firefox 58.0 中,向对象字面量添加索引似乎可以防止对象被解析为对象。

{"a":"b"}
17:37:32.246 {a: "b"}

{"a":"b"}["a"]
17:37:36.578 VM288:1 Uncaught SyntaxError: Unexpected token :

谁能解释为什么解析器不像我那样解析这个? (我觉得一定是我实现的spec有bug。。。)好像觉得不是在解析对象

将对象括在方括号中会导致语法正确的表达式:

({"a":"b"})["a"]
17:42:03.993 "b"

{"a":"b"}["a"] - {} 被检测为 支架体或方块 - 不是对象。让我们看一个关于 if 语句的例子,你可以有这样的东西

if(condition) {
   "a": "b"
}

所以实际上你会得到一个像 "a" : "b" 这样无效的语句。

({"a":"b"})["a"] - () 计算其中的表达式,因此 {} 被检测为对象

它与控制台将 {} 评估为 而不是 对象文字 有关。

这个问题类似于 "Defining a JavaScript object in console" and "Is the curly brackets object notation valid in any expression?" Whosebug 上的问题。

重点部分from the spec is:

ExpressionStatement: [lookahead ∉ {{, function}] Expression ;

注意:ExpressionStatement 不能以大写开头 大括号,因为这可能会使它与 Block 产生歧义。另外,一个 ExpressionStatement 不能以 function 关键字开头,因为 这可能会使它与 FunctionDeclaration.

模棱两可