こんにちは!フロントエンドの現場で、日々コードと格闘しているチーフアーキテクトです。
JavaScriptの世界に足を踏み入れたばかりの皆さん、ようこそ!今日は、少しだけ「通(つう)」な話、でも知っておくとめちゃくちゃ頼りになる『WeakMapとWeakSet』という特別な仲間についてお話しします。
「名前からしてなんだか強そう(あるいは弱そう)で難しそう…」と思うかもしれませんが、大丈夫。身近な例え話で、サクッと紐解いていきましょう。
—
1. 普通の「箱」と、気遣いができる「特別な箱」
JavaScriptには、データを保存しておくための「箱」のような役割をするオブジェクト(MapやSetなど)があります。これらは、入れたものをずっと大事に抱えて離さない「所有欲の強い箱」だと思ってください。
一方で、WeakMapやWeakSetは、もっと大人で気遣いができる「特別な箱」です。
なぜ「Weak(弱い)」なの?
この箱たちは、中に入れたものが「もうどこからも使われていない(=誰も覚えていない)」と判断すると、自分からサッと手放して、メモリから消去してくれます。これを専門用語で「ガベージコレクション(ゴミ集め)」と呼ぶのですが、この箱たちは「不要になったら勝手に捨てていいよ」という、メモリに優しい優しい関係性を築いているんです。
例えるなら、普通のMapが「買い取ったコレクションを一生倉庫に保管する」のに対し、WeakMapは「一時的に預かっている荷物で、持ち主がどこかへ行ってしまったら、迷わず処分してスペースを空ける」というデキるレンタルボックスのようなものですね。
—
2. なぜ「型判定」が難しいのか?
さて、ここからが本題。JavaScriptで「これはWeakMapかな?」と調べたいとき、皆さんは普段どうやって型を調べますか?
そう、`typeof` ですよね。
console.log(typeof new Map()); // “object”
console.log(typeof new WeakMap()); // “object”
…あれ?どちらも `”object”` になってしまいました。これでは見分けがつきません。
実は、WeakMapやWeakSetは「中身を勝手に覗けない」というプライバシーの塊のような仕様になっているため、普通のオブジェクトと見分けるのが少しだけ厄介なんです。
—
3. 現場で使える「見極め術」
じゃあ、どうやって見分けるか。ここで伝説のアーキテクトから伝授する「裏技」を教えましょう。
結論から言うと、「`Object.prototype.toString.call()`」を使うのが一番確実でスマートです。これは、JavaScriptのオブジェクトの「戸籍」を調べるようなものだと思ってください。
実践コード:WeakMapを見抜く!
const myWeakMap = new WeakMap();
// typeofだけでは「object」としか教えてくれない
console.log(typeof myWeakMap); // “object”
// そこで、Objectの戸籍情報を直接覗いてみます
function isWeakMap(value) {
// [object WeakMap] という文字列が返ってくるかを判定する
return Object.prototype.toString.call(value) === ‘[object WeakMap]’;
}
console.log(isWeakMap(myWeakMap)); // true! 見事的中です
console.log(isWeakMap({})); // false
なぜこの方法がいいの?
`typeof` はあくまで「ざっくりとした分類」しかできませんが、`Object.prototype.toString.call()` は、そのオブジェクトが「何という種類のクラスから生まれたか」を正確に教えてくれるんです。
現場のコードで「これは本当にWeakMapかな?」と迷ったときは、この書き方を思い出してください。これだけで、バグの温床を一つ潰せますよ。
—
4. 最後に:焦らなくて大丈夫ですよ
「JavaScriptって、こんな細かいことまで気にしないといけないの?」と不安に思う必要はありません。
今回紹介したWeakMapやWeakSetは、Webアプリが巨大化して「メモリ管理」をシビアに考える必要が出てきた時に初めて輝く、言わば「プロ向けの道具」です。まずは、「世の中には、メモリを無駄遣いしないための賢い箱があるんだな」と知っておくだけで100点満点です。
最初は誰だって `”object”` の海で迷子になります。でも、そのたびにこうやって「中身は何者だろう?」と好奇心を持って覗いてみてください。その積み重ねが、いつかあなたを素晴らしいエンジニアに成長させてくれるはずです。
もしコードを書いていて行き詰まったら、またいつでもここへ来てくださいね。現場からは以上です!応援していますよ。

コメント