私は MDNでのJavaScriptの再紹介 を読んでいて、セクションNumbersで文字列を数字の前にプラス演算子を追加するだけです。
例えば:
+ "42"は、42の数値出力を生成します。
しかし、Operatorsに関するセクションでは、文字列「何か」を任意の数値に追加することで、その数値を文字列に変換できると述べています。また、私を混乱させた次の例を提供します。
「3」+ 4 + 5は、おそらく出力で345のストリングを生成します。これは、数字の4と5もストリングに変換されるためです。
しかし、3 + 4 + "5"は、例で述べたように、文字列75ではなく12の数値を生成しませんか?
演算子に関するセクションのこの2番目の例では、文字列「5」の前に立っている+演算子は、その文字列を数値5に変換してから、12までのすべてを加算しませんか?
あなたが話しているのは単項プラスです。文字列の連結または追加で使用されるプラスとは異なります。
単項プラスを使用して変換し、前の値に追加する場合は、倍にする必要があります。
> 3 + 4 + "5"
"75"
> 3 + 4 + +"5"
12
編集:
操作の順序について学ぶ必要があります。
+
および-
は同じ優先順位を持ち、左側に関連付けられています。
> 4 - 3 + 5
(4 - 3) + 5
1 + 5
6
+
再び左に関連付け:
> 3 + 4 + "5"
(3 + 4) + "5"
7 + "5"
75
単項演算子は通常、二項演算子よりも強い優先順位を持ちます。
> 3 + 4 + +"5"
(3 + 4) + (+"5")
7 + (+"5")
7 + 5
12
答えはEcma262.pdfセクション11.6.1にあります。
Type(lprim)がStringまたはType(rprim)がStringの場合、a。 ToString(lprim)の後にToString(rprim)を連結した結果である文字列を返します。
これにより、優先順位に従ってすべての操作が解決され、文字列が任意の数で見つかるとすぐに、その数が文字列に変換されます。
4 + 3 + "5"
"75"
4 + 3 + "5" + 3
"753"
標準全体を読むには、 here に進みます。
次のように、parseInt()またはparseFloat()を使用することもできます。
> 1 + 2 + "3"
"33"
> 1 + 2 + parseInt(3)
6
+ "3"を使用するよりもずっときれいだと思いますが、それは私の意見です。
ES5仕様の 加算演算子(+) (§11.6.1)でステップ7と「注2」を見ると、
それは言います
Type(lprim)がString`orType(rprim)がStringの場合、ToString(lprim)を連結した結果であるStringを返しますToString(rprim)
注記2ステップ7は、論理演算子および演算の代わりに論理OR演算を使用するという点で、関係演算子(11.8.5)の比較アルゴリズムのステップ3とは異なります。
_7
_(_3+4
_)or_"5"
_(_||
_ not _&&
_)is _typeof "string"
_ toString()
は両方のオペランドに適用されます。
したがって、追加は実際に適用されます
_"7"
_および_"5"
_-> _"7" + "5" //"75"
_
3 + 4 + "5"の例では、3 + 4が最初であるため、Javascriptパーサーは(3 + 4)+ "5"を実行します。したがって、数値であるため3 + 4を追加し、文字列「5」。
Javascriptで数値と文字列を追加すると、結果は常に文字列になります。
ここで実験を確認してください- http://jsfiddle.net/xuVur/1/
var a = "3" + 4 + 5;
var b = 3 + 4 + "5";
$("#result1").html(a); // prints 345
$("#result2").html(b); //prints 75
Javascriptのsmple +演算子は、連結ではなく追加に使用されます。
文字列形式の整数変数の前にあるブラケットと+演算子は、毎回ジョブを実行します。
これは常に正常に機能します。
1 + (+"2") = 3
文字列の前に+を置くと、文字列変数が数値に変換されるためです。
ここでフィドル: http://jsfiddle.net/xuVur/2/