2012-03-21 198 views

回答

11

BlockStatements返回0 ...?

不,blocks返回它們中最後一個表達式的值。你可以只做看到這一點:

{1 + 8} 

...在JavaScript控制檯,它會顯示9

{1 + ''} + 10 // 10
{1 + ''} + '' // 0
爲什麼會出現這種情況?

因爲雖然塊確實返回一個值,但不會使用該值。 {1 + ''} + 10 // 10代碼被評估爲兩個不同的項目:

{1 + ''} // "1" 
+10  // 10 

...或寫那些標準縮進和分號:

{ 
    1 + ''; 
} 
+10; 

...你所看到的第二個結果,彷彿第一個根本就沒有。 +沒有加法運算符,它是unary+(類似於unary -,但它不改變其操作數的符號)。 +10當然是10;而+''0,因爲將運算符應用於字符串會將字符串轉換爲數字,並且Number('')0

你能證明你試圖此看到一元+,而不是加法運算符:

{1 + ''} * 10 

...這實在是

{ 
    1 + ''; 
} 
*10; 

它失敗,語法錯誤因爲沒有一元的*

隨着菲利克斯好心指出了在你的榜樣下面的意見,爲+是加法運算符(這會已經結束了連接字符串,你的情況),它必須是between two expressions,和塊是statement,而不是expression

+0

謝謝!我最初一直困惑,因爲'{''} +'a''返回'NaN',但現在我意識到它是因爲+。 – callumacrae 2012-03-21 11:25:37

+2

這不是100%正確的:http://es5.github.com/#x12.1 *「返回評估StatementList的結果。」*。它並沒有什麼區別,因爲你的塊是一個語句,因此不能在表達式中使用(至少我是這麼理解的)。 – 2012-03-21 11:25:43

+0

@FelixKling:謝謝你!我刪除了不正確的位(「塊不返回任何東西」)。現在我必須深入研究語法(目前我沒有時間做)來理解塊和它後面的表達式保持截然不同的獨立原因。他們是,我知道他們是,但我不知道語法的精確部分是什麼決定...... :-)正如你所說,這很可能與陳述與表達有關。 – 2012-03-21 11:31:42