こんにちは。JavaScriptの世界へようこそ。
この言語を学び始めると、必ず「あれ?なんでこんな動きになるの?」という不思議な現象にぶつかりますよね。実はその裏側には、コンピュータが一生懸命に行っている「お片付け」と「場所の確保」というドラマがあるんです。
今日は、初心者の方が一番つまずきやすい「メモリ管理」の話を、難しい専門用語を使わずに、日常の風景に例えて紐解いていきましょう。大丈夫、仕組みさえ分かればJavaScriptはもっと好きになれますよ!
—
1. 脳内のイメージ:スタックは「机の上」、ヒープは「大きな倉庫」
JavaScriptがデータを保存する場所には、大きく分けて2種類あります。
- スタック(Stack): あなたの「手元のデスク」。すぐ手が届くし、スピードが命。
- ヒープ(Heap): 部屋の外にある「巨大な倉庫」。量はいくらでも入るけれど、取りに行くのに少し手間がかかる。
プリミティブ(単純な値)は「スタック」へ
`10` という数字や、`”こんにちは”` という短い文字列。これらはサイズが小さく、予測可能です。だから、パソコンはこれらを「手元のデスク(スタック)」にポンと置きます。
オブジェクト(複雑な値)は「ヒープ」へ
一方で、配列 `[1, 2, 3]` やオブジェクト `{ name: “太郎” }` はどうでしょう? 中身がどれだけ増えるか分かりませんよね。そんな巨大な荷物を手元のデスクに置くと、すぐに散らかってしまいます。だから、これらは「巨大な倉庫(ヒープ)」に預けるんです。
—
2. なぜこれが重要なのか?「参照」という名のメモ用紙
ここからが一番面白いポイントです。
ヒープ(倉庫)に荷物を置いたとき、JavaScriptは「その荷物がどこにあるかを書いたメモ用紙」を、手元のスタック(デスク)に置いておきます。これを専門用語で「参照(リファレンス)」と言います。
// プリミティブな値(スタックにそのまま置かれる)
let a = 10;
let b = a; // aの値がそのままコピーされるので、bをいじってもaは無関係
// オブジェクト(ヒープに置かれる)
let userA = { name: “太郎” };
let userB = userA; // 倉庫の場所を書いた「メモ用紙」がコピーされる
userB.name = “次郎”; // 倉庫の中身を書き換える!
console.log(userA.name); // なんと「次郎」になっている!
「えっ、`userA`まで変わっちゃうの!?」
そうなんです。初心者の頃、ここでパニックになる人が多いのですが、安心してください。`userB = userA` としたとき、中身を複製したのではなく、「同じ倉庫の場所を指し示すメモをコピーしただけ」だから、結局同じ倉庫の中身をいじっていることになるんです。
—
3. ガベージコレクション:JavaScriptの「お片付け天使」
メモリは無限ではありません。使わなくなったゴミが倉庫に溜まり続けると、パソコンはパンクしてしまいます。
そこで登場するのが「ガベージコレクション(GC)」です。
これは、誰も使っていない荷物を探し出して、倉庫から自動的に捨ててくれる「お片付け天使」のような存在です。
- どうやって見つけるの?
「この荷物を指し示しているメモ(参照)は、まだどこかに残っているかな?」と確認します。もし、どの変数からも「この荷物を使ってますよ!」というメモがなくなったら、その荷物は「ゴミ」とみなして回収してくれます。
だから、私たちはメモリの細かな管理(「このデータを消します」といった命令)を自分でする必要がないんです。JavaScriptが裏で一生懸命掃除してくれているおかげで、私たちはコードを書くことに集中できるんですね。
—
最後に:つまずいた時は「誰がどこを見てる?」を想像して
コードを書いていて「値が勝手に変わった気がする」「なぜか重い」と感じたら、ぜひこのイメージを思い出してください。
1. これはスタック(手元)にあるのか、ヒープ(倉庫)にあるのか?
2. 今、どの変数がその場所を指し示しているのか?
この視点を持つだけで、あなたのデバッグ能力は格段に上がります。最初は難しく感じるかもしれませんが、現場のベテランたちも、頭の中で常にこの「メモ用紙」のやり取りを想像しながらコードを書いています。
焦らなくて大丈夫。一つずつ、JavaScriptという相棒の「裏側のルール」と仲良くなっていきましょう。また何か疑問があったら、いつでも聞きに来てくださいね!

コメント