JavaやC#に慣れている人だとJavaScriptの動的型付けの概念に戸惑うと思うので、この記事では動的型付けについて簡単にまとめてみます。
-------------------------
JavaScriptには、下記の7つのプリミティブ型(ECMAScript 2015の場合)とObject型が存在します。
・Boolean …真偽値を示す。true または false
・null …null値を示す。
・undefined…未定義の値を示す。
・Number …浮動小数点型を示す。例1:100 例2:123.45
・BigInt …整数型を示す。例:123n(これで整数の123の意味となる)
・String …文字列型を示す。例:"Hoge"
・Symbol …名前空間の衝突を防ぐ特殊な型。言語仕様の拡張等で用いられる。
JavaScriptの場合、下記のように変数を定義します。
型名を指定するのではなく、"let"というキーワードで変数であることを示します。
let hoge = 1;
※補足
"let"の代わりに"var"や"const"で変数を定義することもできます。
"var"で定義した変数は、定義したブロックの外でも参照可能になります。
"const"で定義した変数は定数となり、上書きができなくなります。
-------------------------
どのような型でも"let"で変数定義できる、という話であれば、JavaやC#の型推論と同じような話になります。
しかし、JavaScriptの動的型付けは、型推論とは異なる点もあります。
JavaScriptでは、一度変数を定義した後に、定義した時とは異なる型の値を代入することが許されます。
例えば、下記のコードでは、Number型の変数を定義した後にString型の値"Hello World!"を代入していますが、異常終了することなくコンソール上に"Hello World!"と出力されます。
let hoge = 1;
hoge = "Hello World!";
console.log(hoge);
なお、JavaやC#では一度変数の型を定義した後に異なる型の値を代入することは許されておらず、コンパイルエラーとなります。
この挙動の違いを理解していないと、バグ調査する際の絞り込みが難しくなることがあるので、注意が必要です。