JavaScript で、誰か次の 2 つの式の結果を説明できますか。
"4" + 4 および 4 + "4"
ありがとう!
どちらも次のようになりString
ます。
"44"
これは、+
演算子が加算と連結の 2 つの目的を果たすためです。また、いずれかのオペランドが a である(またはinternal によってString
a にキャストされている) 場合、それらは連結されます。String
ToPrimitive()
これは、仕様書で次のように説明されています。
7) Type ( lprim ) が String またはType ( rprim ) が String の場合、
a) ToString ( lprim ) とそれに続くToString ( rprim )を連結した結果の文字列を返します。
8) ToNumber ( lprim ) と ToNumber ( rprim ) に加算演算を適用した結果を返します。11.6.3の下の注を参照してください。
加算を確実にしたい場合は、それぞれにparseFloat()
または単項を使用できます。+
var a = "4", b = 4;
console.log(parseFloat(a) + parseFloat(b)); // 8;
console.log((+a) + (+b)); // 8, extra parenthesis for clarity
1+'1'+1 = '111'
1+1+'1' = '21'
'1'+(1+1) = '12'
'1'+1+1 = '111'
Javascript は、文字列に到達するまで計算を実行してから連結に切り替えます。また、最初に () 操作を実行する通常の数式規則に従います。
どちらも「44」になります。文字列として「4」が存在すると、操作全体が文字列にキャストされるため、2 つの文字が連結されます。
引用元: http://javascript.about.com/od/variablesandoperators/a/vop10.htm
初心者を混乱させる可能性があることの 1 つは、JavaScript がテキスト文字列で + を使用して、数字とはまったく異なる意味を持っていることです。with numbers + は数値を text + と一緒に追加することを意味し、それらを連結することを意味します。連結とは、基本的に、1 つのテキスト文字列を最初の文字列の末尾に結合することを意味し、"my"+"book" は結果として "mybook" になります。初心者が混乱しがちなのは、3+3 は 6 ですが、"3"+"3" は "33" です。
+= をテキスト文字列で使用して、右側の変数またはテキストを左側のテキスト文字列変数の末尾に直接追加することもできます。
データ型の混在
異なるタイプの変数を操作している場合、さらに混乱が生じる可能性があります。すべての操作では、操作対象の変数が同じ型である必要があります。JavaScript が 2 つの異なるデータ型を含む操作を実行できるようにするには、まず変数の 1 つを一方の型から他方の型に変換する必要があります。最初に数値をテキストに変換するか、テキストを数値に変換しないと、数値をテキスト文字列に追加することはできません。
データ型を変換する場合、2 つの選択肢があります。JavaScript に自動的に変換を行わせることも、変換する変数を JavaScript に伝えることもできます。
JavaScript は、減算、乗算、除算、および剰余を取るときに、任意のテキスト文字列を同等の数値に変換しようとします。変換を機能させるには、JavaScript が数値に変換できるもの (つまり、「10」のような文字列) をテキスト文字列に実際に含める必要があります。
+ を使用する場合、これは、文字列を数値に変換してから加算するか、数値を文字列に変換してそれらを連結することを意味します。JavaScript は、これら 2 つの選択肢のうちの 1 つしか実行できません。常に数値を文字列に変換します (文字列に数値が含まれているかどうかに関係なく機能するため)。
下記は用例です。
"5" - 3 = 2;
"5" + 3 = "53"
2 + "7" = "27"
5 + 9 + "1" = "141"
減算は数値でのみ機能するため、1 は減算を行う前にテキスト文字列を数値に変換します。
2 と 3 では、数値がテキスト文字列に変換されてから、他のテキスト文字列に連結 (結合) されます。
4 では、一番左の加算が最初に行われます。これらは両方とも数値であるため、実際には合計され、テキストとして扱われません。この最初の加算の結果は、3 番目の例と同様の状況になるため、その加算の結果はテキストに変換され、連結されます。
実際に JavaScript にテキスト文字列を数値に変換させるには、Number("3") を使用できます。あるいは、JavaScript に数値をテキスト文字列に変換させるには、String(5) を使用できます。
JS の式は、2 つの主要な原則に基づいて機能します。
ただし、それは簡単ではありません
数値に遭遇する限り、左から右への実行を使用して算術加算を行いますが、文字列に遭遇するとすぐに、結果 (文字列に遭遇するまで計算されます) を残りの式と連結します。
//left to right execution
console.log(10+10+"10") //2010, (10+10) of numtype + "10" of stringtype concat(20+"10")
console.log(10+10+"10"+10+10) //20101010,
//(10+10) of number type + "10" stringtype(now since a string is enc.) + (10+10) of number type would act as strings and get concatenated = 20+"10"+"1010"
console.log("10"+[10,10,10]+10) //1010,10,1010
//"10"of stringtype + array of numtypes + 10 of numtype
// "10" concats with first element of array, last number 10 concats with last element of array.
すべてのオカレンスが数字/文字列としての数字である場合、「文字列としての数字」を数字として扱うそれぞれの数学演算が実行されます。
console.log("10"-10) //0
console.log("10"/10) //1
console.log("10"*10) //100
console.log(10+"10"*10) //110 //BODMAS
console.log(Math.pow(10,"10")) //10000000000
(-,*,/,^...) 算術演算を含む式の途中に数値以外の文字列、配列、オブジェクトが出現する場合、常に NaN を返します。
console.log(10-{id:1,name:"hey"}-10) //NaN
console.log(10-10-"hey"-10-10-10) //NaN
console.log("hey"/10) //NaN
console.log("hey"* 3) //NaN
console.log(["hey","hey"]*"3") //NaN
console.log("10"/[10,10,10]/10) //NaN