「JavaScriptは型がない言語です」

プログラミングを調べると、こんな説明をよく見かけます。
でもその直後にこんなコードも出てきます。

let age = 20;
const name = "くれび";

…え?

let とか const って
型の宣言じゃないの?

実はここに、JavaScript最大の誤解ポイントがあります。

JavaScriptは「型がない」のではない

結論から言うと、

JavaScriptは型がない言語ではありません。
変数に型がない言語です。

この違いがとても大事です。

普通の言語:箱にラベルが貼られている

例えば Java という言語ではこう書きます。

int age = 20;
String name = "くれび";

このとき age は「数値専用の箱」
name は「文字専用の箱」になります。

箱の種類が最初から決まっているので、続けて次のように書くと、
プログラムは実行前にエラーとなり、処理は開始されません。

age = "こんにちは"; // エラー

JavaScript:箱にラベルがない

JavaScriptはこうなります。

let x = 10;
x = "こんにちは";
x = true;

同じ x
数値 → 文字 → 真偽値
全部入ります。

つまり

JavaScriptの変数は「なんでも入る箱」

これが「変数に型がない」という意味です。

でも値には型がある

ここが一番重要です。

typeof 10        // number
typeof "hello"   // string
typeof true      // boolean

JavaScriptは

変数ではなく、値が型を持つ

言語です。

じゃあ let と const は何?

では最初の疑問に戻ります。

let age = 20;
const name = "くれび";

これは型ではありません。

let と const は「箱の性質」

書き方意味
let中身を入れ替えられる箱
const中身を入れ替えられない箱

let:後で変えられる

let score = 0;
score = 100; // OK

const:再代入できない

const score = 0;
score = 100; // エラー

なぜ初心者が混乱するのか

こんなコードを見たことありませんか?

"5" + 1   // "51"
"5" - 1   // 4

同じ「5」なのに結果が違う。

これは

変数ではなく、値の型で動作が決まる

からです。

JavaScriptは書き方ではなく「中身」を見て判断する言語です。

まとめ

  • JavaScriptに型はある
  • ただし「変数に型がない」
  • let / const は型ではない
  • 値の型によって動作が変わる

つまり JavaScriptとは

箱ではなく中身を見る言語

ここを理解すると、エラーの意味が一気に読めるようになります。