2012-12-10 39 views
3

我玩JSON對象在Chrome的控制檯,我碰到這個不尋常的行爲來不尋常的行爲:鉻 - JSON對象報表控制檯

> {a:1} 
1 
> {"a":1} 
SyntaxError: Unexpected token : 
> b={a:1} 
Object 
> b={"a":1} 
Object 

爲什麼,而不是一個對象的第一個語句返回1,爲什麼第二種說法有效?我期望前兩個語句返回與最後兩個語句相同的輸出。

+0

FYI,沒有像JSON對象聲明那樣的東西。在JavaScript程序中,'b = {「a」:1}'是對象文字符號,導致JavaScript對象結構...不是JSON數據。使用的符號看起來相似,但結果數據不同。 –

回答

1

JavaScript表達式語句不能以{開頭,因爲它會導致解釋器不明確,也可能將其視爲語句塊。

因此,這被認爲是與語句標籤,而不是一個數字文本對象文本的語句塊:

{a:1} 

但是這被認爲是無效的語法語句塊,因爲沒有可以開始發言與"a":

{"a":1} 

但這些不以{開始。他們從b =開始,因此{被認爲是開始對象字面量。

b = {a:1} 
b = {"a":1} 

12.4 Expression Statement

注意ExpressionStatement不能以大括號開始,因爲這可能使含糊帶座。此外,表達式聲明不能以function關鍵字開頭,因爲這可能會使其與函數聲明不明確。


這意味着,所有你需要做的是一個不同的角色,使其有效啓動表達式語句。

例如,你可以把它包在括號中,它會工作:

({"a": 1}) 
1

我最好的猜測是,在第一種情形下

> {a:1} 

大括號被忽略,a被解釋爲label

您只需輸入

> a:1 

如果這是正確的,第二個例子不工作,因爲雙引號都沒有在標籤可接受的字符得到相同價值1

第三個和第四個例子工作,因爲它們是有效的變量賦值,並且控制檯將對象理解爲對象。

+0

它確實被視爲一個標籤 – C5H8NNaO4

1

Chrome的評估這樣的控制檯輸入:

with ((window && window.console && window.console._commandLineAPI) || {}) { 
    <your code here> 
}; 

這導致視爲額外的{}支架塊範圍括號,因此被忽略

然後導致我們到

a:1 // 1

視爲一個標籤

而且

a={a:1} 

爲正確分配

編輯:

這也是什麼JSLint的說,在這個JSBin