現役プログラマーによるJavaScript奮闘記9!~型変換(キャスト)編~

前回は型について記載しました。

今回は型変換について記載します。

JavaScriptは変数に型を持てず、値に型を持つということを書きました。
Javaみたいな静的型言語に慣れている自分としては概念を理解するのがちょっと大変ですね。

ごちゃごちゃいっても仕方ないです。
いきましょう。

■型変換

結構大切な概念です。

以前足し算をする関数で


function sum(a , b){
return Number(a) + Number(b);
}

と書きましたが、これが型変換です。
引数で渡されたaやbを明示的にnumber型として扱って計算した結果を返すというものになります。

文字列型から数字型に変更するのは
Number関数、parseInt関数、parseFloat関数を使うことが多いです。

それぞれ特徴があり、
Number関数は与えられた文字列を整数、小数問わず数字に変換します。
ただし、数字以外が含まれていた場合、NaN(Not-A-Number)になります。

parseInt関数は文字列の中に数字に変換できないものが含まれていた場合、
その文字列以降を切り捨てて数字に変換します。
何も数字が無かった場合NaNになります。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt

やっぱり公式的な情報は大事

parseInt関数には基数を渡すことができます。
10進数として変換するか、16進数として変換するかといったものです。

また小数は切り捨てられます。

そのためparseIntはこんな感じになります。

parseInt(‘100’) →100(そのまま)
parseInt(‘100.99’) →100(小数切捨て)
parseInt(‘100×200’) →100(x以降切捨て)
parseInt(‘100x’) →100(x以降切捨て)
parseInt(‘100x’,10) →100(x以降切り捨てた上で10進数として捕らえて出力)
parseInt(‘ff’,10) →NaN(一文字目のfが10進数だと数字ではないのでNaN)
parseInt(‘ff’,16) →255(ffを16進数として捕らえて出力)

ややこしいですね。。。

あとparceInt関数には基数をつけたほうがいいとのことです。
>第1引数のstringが「0」で始まるときは、第2引数のradixは8(8進法)または10(10進法)とされます。厳密には、基数がどちらになるかは実装によります。ECMAScript 5 の仕様では10(10進法)です。ただし、まだすべてのブラウザがサポートしている訳ではありません。したがって、parseInt()関数を使うとき基数は必ず与えてください。

こういった細かな仕様を使うたびに調べていくのは本当に大切です。
上のparseIntの仕様を知らずに実装して、「IEでは動いたのに、突然他のブラウザでは動かなくなった!」(いわゆるバグ)
といったことが無いとは限りません。

前も書いた気がします。プログラミングをするときはこういった仕様について理解しながら進めていくのが本当に大切なので、また書いてみました。
こういったこと書くとなんとなくプログラマーにあこがれてるファッションプログラマーみたいな人は「うげ」って思うかもしれないですが、現実なんてこんなもんです。

数字から文字列への置換はString関数を使います。
もしくはnumberのプロパティのtoStringを使います。

String(100)や(100).toString();といった感じです。

■JavaScriptにおける型変換の重要性~暗黙の型変換の防止~

こういったことがなぜ必要なのかというと、JavaScriptは動的型言語なので、暗黙の型変換が発生しやすいです。
暗黙の型変換について説明します。

特に型とか意識しないで、こんな関数を書いたとします。


function sum(a ,b) {
return a + b;
}

このときこうなります。
sum(4, 5) →9(数字の足し算)
sum(‘4’, ‘5’) →45(文字列結合)

ではこうなったら答えはどうなるでしょう
sum(4,’5′)
もしくは
sum(‘4’,5)

このときに数字型と文字型の+はできないので、どちらかがどちらかに勝手に型変換されます。
これが暗黙の型変換です。

エラーになってくれればまだ気づけるのですが、エラーにはならず何らかの計算をしてくれます。

バグの元ですね。

そのため、静的型言語より動的型言語のほうがこういった型については意識する必要があるわけです。

–ちなみに、、、
さっきから言っている静的型言語のJavaだとどういった関数(Javaだとメソッド)になるかも書いておきます。


private double sum(double a , double b){
return a + b;
}

初めのprivateはおまじないです。なんとなく雰囲気は似ていますが、引数のaとbの前にdouble(数字型)と付いています。
このように変数aに対して、「ここには数字型しか渡せません」ということを宣言できるわけです。
当然ここに文字列型やboolean型とか他の型を渡そうとするとエラーになり実行できません。

動的型言語に比べ書くのは面倒ですが、どうしても安全に感じてしまうJava脳人間でした。

はい、今回はこんな感じで型変換と型変換の大切さについて書いてみました。

次回は文について書いていきます。

ではでは

コメント

タイトルとURLをコピーしました