2016-09-28 19 views
0

+[[]] + [[]]があります。コンソールは "0"(文字列)を返します。 ステートメントが+[[]]の場合、コンソールは0(数値)を返します。 +0+0が0の場合、最初の文字列はどのように文字列を返しますか?なぜ+ [[]] + [[]] `は文字列を返しますか?

+2

最初のものは_unary_加え、第1 _binary_一つです。それらを混同しないでください。 – Xufox

+0

javascriptが奇妙です。それはあなたの質問に答えますか? :) –

+0

@pro:文字列はどこから来たのですか? –

答えて

3

ここで構文木は、バイナリ+の左側のオペランドが単項+演算の結果であり、右側のオペランドが結果であることを

  + 
     /\ 
     / \ 
     + [ ] 
     |  | 
     |  | 
     [ ] [ ] 
     | 
     | 
     [ ] 

のように見えます[[]]発現。

runtime semantics of the unary + operator演算子ごとに左側に数字があり、ToNumberを呼び出します。

右辺は、evaluation of the + operatorの手順9でToPrimitive(オブジェクトのtoStringメソッドを呼び出す方法で)によって文字列プリミティブにキャストされるオブジェクトです。配列の場合、toStringは、コンマで連結された配列の内容の文字列形式を返します。この場合は空の文字列です。

あなたは、変更された結果を、いくつかのオブジェクト上toStringをオーバーライドして見ることによってこれを確認することができます。これは、"0foo"が生成されます

var a = []; 
a.toString = function() { return "foo"; }; 
console.log(0 + a); 

1

+[[]] - 単項演算子があります。

単項+演算子は、そのオペランドを数値型に変換します。 Unary - 演算子は、そのオペランドをNumber型に変換してから、それを否定します。

あなたの表現はobviosly +[[]]プラス[[]]「[[]]」によるバイナリ+オペレータに空の文字列に変換されます です。

従ってが0 + '' = '0'

関連する問題