为什么第二行代码产生错误而不是第三行呢?
{ foo: 'bar' } // => 'bar'
{ "foo": 'bar' } // => SyntaxError: Invalid label
({ "foo": 'bar' }) // => { foo: 'bar' }.
答案 0 :(得分:6)
语言规范的相关部分是http://es5.github.com/#x12.4
ExpressionStatement:[lookahead∉{
{
,function
}]表达式;
前瞻部分意味着只有当某个表达不是以{
或function
开头时才出现在预期语句的位置,才会将其视为表达式。
{ foo: 'bar' }
是包含带有标签'bar'
的表达式语句foo
的语句块。标签允许您从命名循环中break
或continue
,但可以附加到任何语句,而不仅仅是循环。
{ "foo": 'bar' }
解析器开始解析它,找到表达式"foo"
,然后查找二进制运算符,但:
不是有效的二元运算符,因此它失败并出现语法异常。
({ "foo": 'bar' })
这里括号输入表达式上下文,因此{
被视为启动对象构造函数而不是块的开头。