2010-09-17 89 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 
相關問題