2012-07-09 72 views
2

我打犀牛,發現在這似乎是運算符優先級這種奇怪的行爲:的Javascript優先

js> {}+{} 
NaN 
js> ''+{}+{} 
[object Object][object Object] 
js> ''+({}+{}) 
[object Object][object Object] 

我希望表達''+({}+{}),以評估"NaN",因爲{}+{}應先評估,但這不會發生。我在V8和Firefox中測試了這一點,並得到了相同的結果。

爲什麼在這種情況下Javascript不遵循給定括號的標準優先級(4*(1+2)仍然是預期的12)?

+1

console.log({} + {}); [object Object] [object Object] – 2012-07-09 07:48:15

+0

@Sudhir是的,因爲括在括號內意味着它是一個表達式而不是一個聲明。 – Alnitak 2012-07-09 07:49:01

+0

@Annitak感謝您的澄清,沒有認爲我的那個 – 2012-07-09 07:50:24

回答

6

一個純{}被視爲一個塊語句使你的代碼實際上是:

{ 
    //empty block 
} 


+{}; //Convert object to number 

我應該解釋一下簡單的意思:

這意味着在一份聲明中上下文{}({})是一個對象,因爲圓括號不能包含語句,它們只能包含表達式。

+0

@lanzz我應該改寫一下。通過**普通**,我的意思是沒有其他任何東西作爲聲明。它被視爲一個塊。 '{你好:「世界」,嗨:「再次」}「是一個語法錯誤。 '{你好:'world'}'是一個塊,標籤和一個字符串。 – Esailija 2012-07-09 07:47:57

+0

這是正確的答案。第一個'{}'被解釋爲塊,第二個作爲對象字面量。 @Travis:括號按預期工作,您的assunption,{} + {}'爲'NaN'的結果是不正確的。 – 2012-07-09 07:49:07

+0

+1是的。嘗試'({} + {})'(產生「[object Object] [object Object]」)演示了這一點。 – lonesomeday 2012-07-09 07:49:59

0

這很簡單:

{} 

是一個語句,以及:

({}) 

是一個表達式。

只有後者(或任何其他強制解釋者將大括號視爲空對象)纔會導致[object Object]