{1 + ''} + 10 // 10
{1 + ''} + '' // 0
爲什麼會發生這種情況? BlockStatements是否返回0,爲什麼?JavaScript BlockStatement混淆
{1 + ''} + 10 // 10
{1 + ''} + '' // 0
爲什麼會發生這種情況? BlockStatements是否返回0,爲什麼?JavaScript BlockStatement混淆
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。
謝謝!我最初一直困惑,因爲'{''} +'a''返回'NaN',但現在我意識到它是因爲+。 – callumacrae 2012-03-21 11:25:37
這不是100%正確的:http://es5.github.com/#x12.1 *「返回評估StatementList的結果。」*。它並沒有什麼區別,因爲你的塊是一個語句,因此不能在表達式中使用(至少我是這麼理解的)。 – 2012-03-21 11:25:43
@FelixKling:謝謝你!我刪除了不正確的位(「塊不返回任何東西」)。現在我必須深入研究語法(目前我沒有時間做)來理解塊和它後面的表達式保持截然不同的獨立原因。他們是,我知道他們是,但我不知道語法的精確部分是什麼決定...... :-)正如你所說,這很可能與陳述與表達有關。 – 2012-03-21 11:31:42