JavaScriptの変数の型は結構いい加減です。以下のようにしたとき、xxは数値型の123が、yyは文字列型の"123"が代入されます。xx = 123; yy = "123";変数が数値変数か、文字列変数かは、IE4.0/NN3.0からサポートされた typeof() を用いて調べることができます。xx = 123; alert(typeof(xx)); yy = "123"; alert(typeof(yy));
文字列を含む足し算は文字列演算子として扱われます。双方が数値の場合や、引き算、掛け算、割り算の時は、数値として扱われます。そのため、"123"に0を足すと"1230"、0を引くと 123 という奇妙な結果になったりします。xx = "123" + 0; → 1230 となる xx = "123" - 0; → 123 となる xx = "123" + "1"; → "1231" となる xx = "123" + 1; → "1231" となる xx = 123 + "1"; → "1231" となる xx = 123 + 1; → 124となる xx = "123" - "1"; → 122 となる xx = "123" * "1"; → 123 となる xx = "123" / "1"; → 123 となる
フォームの値を計算するときに、よくこの間違いをするので、注意が必要です。下記の例では、フォームに入力したデータに5を足すつもりですが、実際には、文字列として最後に "5" を付け足すという処理になってしまいます。document.FORM1.TEXT1.value += 5;
文字列を数値に変換するにはNumber()、parseFloat()、parseInt()、eval()など、数値を文字列に変換するにはString()などを用います。また、数値にするには0を引く、文字列にするには "" を足すという方法もあります。xx = "123"; xx -= 0; → xxは数値変数になる xx = 123; xx += ""; → xxは文字列変数になる
比較演算子(==)で数値と文字列の比較を行う場合はさらに注意が必要です。下記の例は、大抵のブラウザで「同じ」という結果になります。<SCRIPT LANGUAGE="JavaScript"> <!-- if ("123" == 123) { alert("同じ"); } else { alert("違う"); } //--> </SCRIPT>ところが、NN4.0では、LANGUAGE="JavaScript1.2"とした時は文字列と数値は厳密に解釈するというとんでもない仕様変更を行ってしまったため、LANGUAGE="JavaScript1.2" にすると上記の結果は「違う」になってしまいます。(さすがに、この仕様変更は不評だったためか、NNのJavaScript1.3では、再度仕様が戻されています。IEではずっと「同じ」のままです。)<SCRIPT LANGUAGE="JavaScript1.2"> <!-- if ("123" == 123) { ← NN4.0でのみ、偽になってしまう :こんな状況で、混乱が続いていますが、最近(IE4/NN45)のバージョンでは、演算子==は型を無視し、演算子===は型を厳密に解釈するということにしています。if ("123" == 123) ← 同じ if ("123" === 123) ← 違うしかし、演算子===をサポートしていないブラウザもまだ多数存在するため、まだ、しばらくの間は、下記のように、明示的に数値に変換してから比較するのがお勧めです。if (parseInt("123") == parseInt(123)) {