在Javascript控制台中键入{a:1}给出1,{a:1,b:2}给出错误的行为是什么?
以下内容将显示在Firebug或其他Javascript交互控制台中:在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
>>> 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'
)
要确保使用的是对象文字的语法,可以用括号(也称为)将其括起来:
分组运算符只能接受表达式,因此不存在歧义
另见:
+我今天学到了一些新的东西。我从来没有在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