このコードが次のように評価されるのはなぜですか。
10 + "10" => "1010"
"10" + 10 => "1010"
そして、なぜこのように機能しないのですか:
10 + "10" => 20 // the number comes first
"10" + 10 => "1010" // the string comes first
編集:
より具体的には、インタープリターの実装のどこでこれを行うのでしょうか? または、どのようにこれを行いますか?
このコードが次のように評価されるのはなぜですか。
10 + "10" => "1010"
"10" + 10 => "1010"
そして、なぜこのように機能しないのですか:
10 + "10" => 20 // the number comes first
"10" + 10 => "1010" // the string comes first
編集:
より具体的には、インタープリターの実装のどこでこれを行うのでしょうか? または、どのようにこれを行いますか?
ECMAScript 262 仕様はJavaScript 言語を成文化しています (JavaScript は実際には ECMAScript の Mozilla 実装です)。いずれにせよ、私が普段参考にしているAnnotated ES5では、比較的簡単に見つけることができます。
11.6.1 加算演算子 ( + )を参照してください。
加算演算子は、文字列連結または数値加算のいずれかを実行します。
プロダクション AdditiveExpression : AdditiveExpression + MultiplicativeExpression は次のように評価されます。
- AdditiveExpression を評価した結果を lref とする。
- lval を GetValue(lref) とします。
- MultiplicativeExpression を評価した結果を rref とします。
- rval を GetValue(rref) とします。
- lprim を ToPrimitive(lval) とします。
- rprim を ToPrimitive(rval) とします。
- Type(lprim) が String または Type(rprim) が String の場合、ToString(lprim) と ToString(rprim) を連結した結果の String を返します。
- ToNumber(lprim) と ToNumber(rprim) に加算演算を適用した結果を返します。11.6.3 の下の注を参照してください。
+
連結演算子であり、Javascript の算術演算子でもあります。演算子が文字列と数値の間で使用されていることがわかった場合、その数値を文字列に連結します。そうでない場合、2 つの整数に対して演算子を使用すると、結果も整数になります。
そう、
STRING + STRING = STRING
文字列 + 整数 = 文字列
整数 + 文字列 = 文字列
整数 + 整数 = 整数
異なる型を持つ値を比較する場合、JavaScript は複雑で紛らわしい一連のルールを使用します。一般に、値の1つを他の値の型に変換しようとするだけです(質問でわかるように)。これは、自動型変換と呼ばれることがよくあります。
あなたのコードを見てみましょう:
10 + "10" => "1010"
"10" + 10 => "1010"
JavaScript では、文字列以外の値が文字列に追加されると、その値は連結される前に自動的に文字列に変換されます。したがって、JavaScript は、整数値または文字列値の順序に関係なく、整数を文字列として扱います。
ただし、JavaScript がこれをすべての算術演算子に適用するわけではないことを知っておく必要があります。たとえば、値を乗算すると、次のようになります。
10 * "10" => 100
"10" * 10 => 100
"ten" * 10 => NaN
では、なぜ Javascript はこれを行うのでしょうか。まあ、あなたはそれが便宜上のものであると主張することができます. 2 つの値を 1 つの文字列に連結する必要がある場合が多くあります。逆に、上記の最後の例でわかるように、整数と文字列を乗算することはできません。
残念ながら、これがJavascriptの仕組みです