对象定义SyntaxError

Yaş*_*ÇLİ 2 javascript

为什么第二行代码产生错误而不是第三行?

{ foo: 'bar' } // => 'bar'

{ "foo": 'bar' } // => SyntaxError: Invalid label

({ "foo": 'bar' }) // => { foo: 'bar' }.
Run Code Online (Sandbox Code Playgroud)

Mik*_*uel 6

语言规范的相关部分是http://es5.github.com/#x12.4

ExpressionStatement:[lookahead∉{ {,function}]表达式;

前瞻部分意味着只有在某个语句出现时,如果某个语句不以{or 开头,那么它只被视为表达式function.


{ foo: 'bar' }
Run Code Online (Sandbox Code Playgroud)

是包含'bar'带有label 的表达式语句的语句块foo.标签允许您来自breakcontinue来自命名循环,但可以附加到任何语句,而不仅仅是循环.

{ "foo": 'bar' }
Run Code Online (Sandbox Code Playgroud)

解析器开始解析它,找到一个表达式"foo"然后查找二进制运算符但:不是有效的二元运算符,因此它失败并出现语法异常.

({ "foo": 'bar' })
Run Code Online (Sandbox Code Playgroud)

这里括号输入表达式上下文,因此将{其视为启动对象构造函数而不是块的开头.