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.
模棱两可
在 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.