我玩JSON對象在Chrome的控制檯,我碰到這個不尋常的行爲來不尋常的行爲:鉻 - JSON對象報表控制檯
> {a:1}
1
> {"a":1}
SyntaxError: Unexpected token :
> b={a:1}
Object
> b={"a":1}
Object
爲什麼,而不是一個對象的第一個語句返回1,爲什麼第二種說法有效?我期望前兩個語句返回與最後兩個語句相同的輸出。
我玩JSON對象在Chrome的控制檯,我碰到這個不尋常的行爲來不尋常的行爲:鉻 - JSON對象報表控制檯
> {a:1}
1
> {"a":1}
SyntaxError: Unexpected token :
> b={a:1}
Object
> b={"a":1}
Object
爲什麼,而不是一個對象的第一個語句返回1,爲什麼第二種說法有效?我期望前兩個語句返回與最後兩個語句相同的輸出。
JavaScript表達式語句不能以{
開頭,因爲它會導致解釋器不明確,也可能將其視爲語句塊。
因此,這被認爲是與語句標籤,而不是一個數字文本對象文本的語句塊:
{a:1}
但是這被認爲是無效的語法語句塊,因爲沒有可以開始發言與"a":
{"a":1}
但這些不以{
開始。他們從b =
開始,因此{
被認爲是開始對象字面量。
b = {a:1}
b = {"a":1}
注意的ExpressionStatement不能以大括號開始,因爲這可能使含糊帶座。此外,表達式聲明不能以
function
關鍵字開頭,因爲這可能會使其與函數聲明不明確。
這意味着,所有你需要做的是一個不同的角色,使其有效啓動表達式語句。
例如,你可以把它包在括號中,它會工作:
({"a": 1})
Chrome的評估這樣的控制檯輸入:
with ((window && window.console && window.console._commandLineAPI) || {}) {
<your code here>
};
這導致視爲額外的{
}
支架塊範圍括號,因此被忽略
然後導致我們到
a:1
// 1
視爲一個標籤
而且
a={a:1}
爲正確分配
編輯:
這也是什麼JSLint的說,在這個JSBin
FYI,沒有像JSON對象聲明那樣的東西。在JavaScript程序中,'b = {「a」:1}'是對象文字符號,導致JavaScript對象結構...不是JSON數據。使用的符號看起來相似,但結果數據不同。 –