型変換(キャスト) とは?
- データの型を別の型に変換する操作で、明示的変換と暗黙的変換がある
- 明示的変換はプログラマーが意図的にコードで指定する(Number()、parseInt()など)
- 暗黙的変換は言語が自動で行うもので、予期しないバグの原因になりやすい
- 変換できない値を変換しようとするとNaNやエラーになるので入力チェックが重要
型変換ってどんなときに必要なの?
暗黙的変換って何?
プログラマーが明示的に書かなくても言語が勝手に型を変換することだよ。JavaScriptは特にこれが激しくて、「'5' - 3」が2になったり(文字列が数値に暗黙変換)、「'5' + 3」が'53'になったり(数値が文字列に暗黙変換)する。同じ演算子なのに動作が違うから混乱するんだ。
型変換で気をつけることってある?
まず暗黙的変換に頼らず、常に明示的に変換する癖をつけること。Number()やString()を使って意図を明確にしよう。あとparseInt('10px')が10を返すように、変換できる部分だけ変換する関数もあるから挙動をよく確認すること。TypeScriptのような型付き言語を使えば、型の不一致をコンパイル時に検出できるから、そもそもの事故を減らせるよ。
TypeScriptの型アサーション(as)も型変換なの?
実は違うんだ。TypeScriptの「value as string」は型アサーション(型の主張)で、実行時にはデータを変換しない。コンパイラに「これは文字列だと信じて」と伝えるだけ。実際のデータが数値のままでもエラーにならないから、嘘のアサーションをするとランタイムエラーの原因になる。実行時の型変換はNumber()やString()を使う必要があるよ。
型変換に関するバグで有名なものってある?
JavaScriptの「==」による暗黙的型変換は有名なバグの温床だよ。「[] == false」がtrueになったり、「'' == 0」がtrueになったりする。だから===(厳密等価演算子)を使うのが常識。他にもC言語の暗黙的な整数拡張で、unsigned intとintの比較でバグが起きるケースは有名で、「-1 > 1u」がtrueになる(-1がunsignedに変換されて巨大な数になる)。型変換は「何が起きているか」を常に意識することが大事だよ。