2012-03-21 5 views

答えて

11

Do BlockStatements returns 0 ...?

いいえ、blocksは、その中の最後の式の値を返します。これを見るだけで、

{1 + 8} 

... 9と表示されます。

{1 + ''} + 10 // 10
{1 + ''} + '' // 0
これはなぜ起こるのでしょうか?

ブロックは値を返しますが、その値は使用されないためです。

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

...または標準インデントやセミコロンでそれらの書き込み:{1 + ''} + 10 // 10コードは、2つの異なる項目として評価されて

{ 
    1 + ''; 
} 
+10; 

を...そしてあなたは、第1の結果を見ています、最初のものはまったくそこになかったかのように。 +加算演算子はありません。unary+です(unary -に似ていますが、そのオペランドの符号は変更されません)。 +10はもちろん、10です。 +''0です。演算子を文字列に適用すると文字列が数値に変換され、Number('')0になるためです。

あなたはこの試みることによって単項+ではなく、加算演算子を見ていることを証明することができますです

{1 + ''} * 10 

は...本当に

{ 
    1 + ''; 
} 
*10; 

それは構文エラーで失敗します単元がないので*です。フェリックスは親切に(あなたのケースでは、文字列を連結することになっただろう)加算演算子であることをあなたの例では+ために、以下のコメントで指摘しているように、それはbetween two expressionsでなければならないであろう

、およびAブロックはstatementで、expressionではありません。

+0

ありがとうございます!私は最初に '{''} + 'a''が' NaN'を返すので混乱しましたが、今は+が原因であることに気付きました。 – callumacrae

+2

これは100%正確ではありません:http://es5.github.com/#x12.1 * "StatementListを評価した結果を返します" *。違いはありませんが、ブロックはステートメントなので、式の中で使用することはできません(少なくとも私がそれを理解する方法です)。 –

+0

@FelixKling:ありがとう!間違ったビット(「ブロックは何も返さない」)を削除しました。そして、ブロックとそれに続く式が区別されて分離されている根本的な理由を理解するために、文法に掘り下げなければなりません(私は現時点でそうする時間がありません)。彼らは、私は彼らの存在を知っていましたが、文法の正確な部分が何を指示するのかはわかりません:-)あなたが言ったように、文と表現とはおそらく同じです。 –