やあ、こんにちは!JavaScriptの深淵へようこそ。
コードを書き始めたばかりの頃って、画面に文字が表示されるだけでワクワクするよね。でも、その「文字列」たちが裏側でどうやって管理されているか、少しだけ覗いてみないかい?
今日は、JavaScriptという巨大な図書館の「司書さん」がやっている、ちょっとした魔法のお話をするよ。
—
あなたの書いた「文字」は、どこに隠れているの?
JavaScriptでコードを書くとき、私たちは何気なく `”Hello”` や `”JavaScript”` といった文字列を使いますよね。
const greeting = “こんにちは”;
const message = “こんにちは”;
ここで質問です。この2つの変数 `greeting` と `message` は、メモリ(コンピュータの作業机)の上で、別々の場所に置かれていると思う?
実は、JavaScriptのエンジン(V8など)は、「同じ内容の文字列なら、同じ場所を使い回せば効率的じゃない?」と考えます。これを「文字列インターニング(String Interning)」と呼びます。
魔法の図書館の例え話
想像してみて。あなたは大きな図書館の司書さんです。
図書館に、「こんにちは」と書かれた本が100万冊あるとします。もし本当に100万冊の物理的な本を並べたら、棚がいくらあっても足りないよね?
そこで司書さんは、こう決めたんだ。
「『こんにちは』という本は1冊だけ棚に置いておいて、みんなでその本を共有しよう!」
誰かが「こんにちは」という文字列を使おうとしたら、司書さんは「ああ、それならあそこの棚にある本を見てごらん」と、同じ場所を指し示す。これが「インターニング」の正体です。
—
なぜこんなことをするの?
理由はたった一つ、「メモリの節約」と「スピードアップ」のためです。
もし毎回新しい文字列をバラバラに作っていたら、メモリはすぐにパンクしちゃうし、プログラムが重くなってしまう。同じ内容を一度だけ作って、あとは使い回す。この賢い仕組みのおかげで、JavaScriptは軽快に動いているんだよ。
注意してほしいこと:全部がインターニングされるわけじゃない
ここが少し泥臭い現実なんだけど、実は「どんなときでも自動的に使い回してくれるわけではない」んだ。
- リテラル(直接書いた文字): `”Hello”` のように、コードに直接書いたものは、エンジンが「これは後で使い回すぞ!」と判断しやすい。
- 計算や加工で作った文字: `slice` や `replace` などを使って新しく作った文字列は、毎回「新しく生成されたもの」として扱われることが多いんだ。
「さっきと同じ内容の文字を作ったはずなのに、なぜか違うものとして扱われる…?」と悩んだら、それは「新しく作り直したから」だと考えていいよ。大丈夫、それは君のコードが間違っているんじゃなくて、そういう仕組みなだけだからね。
—
実際にコードで確かめてみよう
以下のコードをコピーして、ブラウザのコンソールに貼り付けてみて。
// 同じリテラルを代入
const a = “JavaScript”;
const b = “JavaScript”;
// 比較してみると…
console.log(a === b); // true (同じ場所を指しているから、値も等しい!)
// 文字列操作で新しい文字列を作ってみる
const c = “Java” + “Script”;
// 内容は同じだけど、メモリ上では別の存在として作られる可能性がある
console.log(a === c); // true (値としては等しい)
/
補足:
‘===’ は「値が同じか」を見ているのでtrueになります。
でも、メモリの管理レベルでは、意図的に作られた文字列は
「別物」として扱われることもあるんだよ。
/
—
今日持ち帰ってほしいこと
1. 文字列は「使い回される」ことがある: 同じ文字を何度も書くのは、メモリにとって優しいことなんだ。
2. エンジンは頑張り屋さん: 私たちが意識しなくても、ブラウザの裏側ではメモリを節約するための努力が常に行われている。
3. 細かいことは気にしすぎないで: 「インターニングされるかな?」と過剰に気にしてコードを書く必要はないよ。まずは「動くもの」を楽しく作ることが一番大切だからね。
JavaScriptの世界は、こうした小さな工夫の積み重ねでできている。一つひとつのコードが、裏側でどう動いているか想像できるようになると、プログラミングがもっともっと面白くなるはずだよ。
また分からないことがあったら、いつでも聞きに来てね。君のコードが最高に輝くのを応援しているよ!

コメント