2010-09-17 88 views
15

下面将在Firebug或jsconsole.com或其他JavaScript交互式控制台显示:在Javascript控制台中给出1,{a:1,b:2}给出错误的{a:1}打字行为是什么?

>>> 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中,他们会按照您定义的方式回来。

+1

这是一个很大的问题,然后一个很好的答案!很显然,我在谈论CMS的答案。 – 2010-09-17 00:28:40

+0

http://stackoverflow.com/questions/1509535/javascript-false-and-false/1509664#1509664是一个看似无关紧要的问题,但是对于你可能会绊倒的一件事情有一个相关的答案。 – 2010-09-17 00:31:12

回答

24

第二行是给你一个SyntaxError因为{令牌在它开始引起歧义,解析器将其视为好像它是一个Block statement,而不是一个对象文本的开始。

例如,一个有效的块语句:

{ foo: 'bar' } 

上面看起来像对象文本,但它不是,因为代码在语句上下文评价。

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

为了确保您使用的对象文本的语法,可以用括号(也称为the grouping operator)把它包装:

({ foo: 'bar' }) 

分组操作者只能取表达式,因此没有歧义。

参见:

+0

+1今天我学到了新东西。我从来没有把对象 - 文字语法放到REPL中,而没有将它分配给var,但这很有趣。 – Matt 2010-09-17 00:23:58

+0

(一个'标记语句'是JavaScript从C继承的东西,它可以用于'goto标注语句在JavaScript中几乎从不使用,这就是为什么“{foo:'bar'}”可以被看作是一个有效语句令人惊讶的原因。) – bobince 2010-09-17 00:25:02

+0

完全真棒的答案,如果可能的话,将upvote两次! – 2010-09-17 00:26:23

0

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

0

控制台执行,与eval(“你输入”)

eval({....}) --- this will get an error 
eval('({....})')---eval string as a function 
相关问题