JavaScriptのNaNを上書きできたと思ったら勘違いだった話
はじめに
JavaScriptで以下のコードを書いたとき、
const NaN = 10;
console.log(NaN);
「え、NaNって上書きできるの?」と思いました。
しかし結論から言うと、これは勘違いでした。
何が起きていたのか
このコードはエラーではなく、普通に動きます。
const NaN = 10;
console.log(NaN); // 10
理由はシンプルで、
これはグローバルのNaNを書き換えているのではなく、ただのローカル変数定義だから
グローバルのNaNとは別物
JavaScriptには最初から NaN という値が存在します。
typeof NaN // "number"
NaN === NaN // false
これは「数値計算が失敗した結果」を表す特殊な値です。
混乱の原因
今回のポイントはスコープでした。
const NaN = 10;
このNaNは:
- グローバルのNaNではない
- ただの変数名
- スコープ内でグローバルより優先される
つまり「同じ名前の別人」です。
本物のNaNは書き換えできない
NaN = 123; // ❌ エラーまたは無効
または
const NaN = 123; // ❌ 再宣言エラー
まとめ
- NaNは予約語ではない
- しかしグローバルのNaNは書き換え不可
-
const NaN = 10はローカル変数として動いているだけ - JavaScriptは「同名でも別物になるスコープ言語」
学び
今回の件で重要だったのはNaNそのものではなく、
「グローバル変数とローカル変数のスコープの違い」
でした。
🎯 一言まとめ
NaNは壊れてるのではなく、
「勘違いされやすいだけでちゃんとルール通り動いている」