JavaScript の場合は、var let const いずれにしても、変数に型を限定することはできません。数値でも文字列でも同じように変数にいれることができます。
1 2 3 |
var value1; value1 = 100; value1 = 'ABC'; |
このように同じ変数に数値をいれたり文字列を入れたりすることができます。
しかし、他の言語では、変数の型を限定することができるものも多いです。
これは例ですがこのような感じです。
1 2 3 4 5 |
int value1; value1 = 100; // 整数値しか代入できない。文字列を代入するとエラーになる string value2; value2 = 'ABC'; // 文字列しか代入でいない。 |
JavaScriptのような言語を、動的型付け言語と呼びます、変数の方が動的に変化するからです。対して、変数の方がきっちり決まってしまうような言語を、静的型付け言語と呼びます。
どちらかというと静的型付け言語の方が開発しやすいです。間違いが起きることが少なくなるからです。
JavaScriptは動的型付け言語です。これでは開発しにくいから、という理由もあり TypeScript というようなJavaScript に変換できる 拡張JavaScript(altJS)と呼ばれる言語も登場しています。
JavaScript でも変数の型を知りたい。
この変数には、なんの型が入っていただろうか、と確認したくなる場面は非常に多いです。なので、そのようなことを知るための関数を用意しましょう。 次のような関数を作ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
var isBoolean = function(value) { return (typeof value === 'boolean'); }; var isNumber = function(value) { return ((typeof value === 'number') && (isFinite(value))); }; var isInt = function(value) { if (!isNumber(value)) { return false; } return Math.round(value) === value; }; var isString = function(value) { return (typeof value === 'string'); }; var isFunction = function(value) { return (typeof value === 'function'); }; var isObject = function(value) { if ( (Object.prototype.toString.call(value) === '[object Object]') && (value !== null) && (typeof value !== 'undefined') ) { return true; } return false; }; var isArray = function(value) { return Object.prototype.toString.call(value) === '[object Array]'; }; var isDate = function(value) { return Object.prototype.toString.call(value) === '[object Date]'; }; |
これで、変数を宣言して値を入れてこの関数に渡せば、それが、Boolena か数値か整数値か文字列か関数かオブジェクトか配列か、がわかるようになります。
こんなふうに使います。
1 2 3 4 5 6 7 8 9 10 |
var value1 = 123.4; if (isNumber(value1)) { if (isInt(value1)) { console.log('整数です'); } else { console.log('小数点がついている数値です'); // これが表示されます } } else { console.log('文字列です'); } |
先日書いた内容のところの、isNull や isUndefined とあわせて使うと、より便利になるでしょう。
複数の値を同時にチェックしたり、否定の値をチェックしたりする多数の関数の例は、私の作っているライブラリで実装されているので参考にしてください。
関数の引数に型を限定させるときに使う
型を判定するコードはこのような場面で使うと、とても強力です。強力というのは、プログラミングが効果的に書きやすくなるということ。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var test1 = function(value1) { assert(isString(value1)); // 文字列以外が引数として渡ってくると、例外発生して落ちるので // ここ以降は、value1 は「文字列」であることが確定するので // プログラムが書きやすい }; var test2 = function(value1, value2, value3) { assert(isNumbers(value1, value2, value3); // value1,2,3は全て数値ということが確定される。 }; |
assert は「宣言する」という意味の英単語で、プログラムでは true を受け取ったら何もせずに、false を受け取ったら例外を発生させて、プログラムを止めようとする、という命令です。
これで、プログラムが書きやすくなるというものなわけです。
変数の型を判定して、上手にプログラミングできるようになっていってください。
JavaScript は動的型付け言語といわれますが、自分でisNumberなどの関数を用意して判定することで、静的型付け言語と同じような開発効率を得て、生産性を高めることができます。
いろいろ工夫してみてください。