在Javascript控制台中键入{a:1}给出1,{a:1,b:2}给出错误的行为是什么?

在Javascript控制台中键入{a:1}给出1,{a:1,b:2}给出错误的行为是什么?,javascript,firebug,javascript-objects,Javascript,Firebug,Javascript Objects,以下内容将显示在Firebug或其他Javascript交互控制台中: >>> foo = { a : 1, b : 2.2 } Object { a=1, more...} >>> foo.a 1 >>> foo.b 2.2 >>> { a : 1, b : 2.2 } SyntaxError: invalid label { message="invalid label", more...} >>&g

以下内容将显示在Firebug或其他Javascript交互控制台中:

>>> foo = { a : 1, b : 2.2 }
Object { a=1, more...}

>>> foo.a
1

>>> foo.b
2.2

>>> { a : 1, b : 2.2 }
SyntaxError: invalid label { message="invalid label", more...}

>>> { a : 1 }
1

为什么
1
返回
{a:1}
,为什么
{a:1,b:2.2}
给出错误?在Ruby中,它们的返回方式与您定义它的方式相同。

第二行给您一个
SyntaxError
,因为它开头的
{
标记会导致歧义,解析器将其视为一个字符串,而不是对象文本的开头

例如,有效的Block语句:

{ foo: 'bar' }
上面的代码看起来像一个对象文字,但它不是,因为代码是在语句上下文中计算的

它将被解析为一个块,其中包含一个(
foo
),后跟一个表达式语句(
'bar'

要确保使用的是对象文字的语法,可以用括号(也称为)将其括起来:

分组运算符只能接受表达式,因此不存在歧义

另见:


我不是100%肯定,但我想发生的是,在第二行中,您定义的是一个块,而不是一个对象。因此,当解析器到达逗号时,解析错误就会出现,因为它需要一个半彩色。定义的标签是标签,就像goto或switch语句中的标签一样。我希望这个解释有意义。

控制台按e执行val('您输入')


+我今天学到了一些新的东西。我从来没有在REPL中只使用对象文字语法而不将其分配给var,但知道这一点很有趣。(“带标签的语句”是从C继承的JavaScript,可以用于
goto
​s、 JavaScript中几乎从不使用带标签的语句,这就是为什么
{foo:'bar'}
可以被视为有效语句的原因。)这是一个很好的问题,然后是一个很好的答案!显然,我在谈论CMS的答案。这是一个看似无关的问题,但有一件事你可能会被绊倒。你是否试图显示
eval({}”)
eval({})”之间的区别
并且意外地忘记了引号?如果您解决了这个问题,每个案例的描述都是不正确的。如果不是,这个答案与问题无关。答案也没有解释为什么一种语法与另一种语法不正确,以及
eval
与任何一种语法的关系。
({ foo: 'bar' })
eval({....}) --- this will get an error
eval('({....})')---eval string as a function