<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>http://mochiuwiki.e2.valueserver.jp/index.php?action=history&amp;feed=atom&amp;title=JavaScript%E3%81%AE%E5%9F%BA%E7%A4%8E_-_Map</id>
	<title>JavaScriptの基礎 - Map - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="http://mochiuwiki.e2.valueserver.jp/index.php?action=history&amp;feed=atom&amp;title=JavaScript%E3%81%AE%E5%9F%BA%E7%A4%8E_-_Map"/>
	<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=JavaScript%E3%81%AE%E5%9F%BA%E7%A4%8E_-_Map&amp;action=history"/>
	<updated>2026-09-06T16:29:36Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=JavaScript%E3%81%AE%E5%9F%BA%E7%A4%8E_-_Map&amp;diff=14352&amp;oldid=prev</id>
		<title>Wiki: Wiki がページ「JavaScriptの基礎 - map」を「JavaScriptの基礎 - Map」に、リダイレクトを残さずに移動しました</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=JavaScript%E3%81%AE%E5%9F%BA%E7%A4%8E_-_Map&amp;diff=14352&amp;oldid=prev"/>
		<updated>2026-02-19T15:16:24Z</updated>

		<summary type="html">&lt;p&gt;Wiki がページ「&lt;a href=&quot;/index.php?title=JavaScript%E3%81%AE%E5%9F%BA%E7%A4%8E_-_map&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;JavaScriptの基礎 - map (存在しないページ)&quot;&gt;JavaScriptの基礎 - map&lt;/a&gt;」を「&lt;a href=&quot;/index.php?title=JavaScript%E3%81%AE%E5%9F%BA%E7%A4%8E_-_Map&quot; title=&quot;JavaScriptの基礎 - Map&quot;&gt;JavaScriptの基礎 - Map&lt;/a&gt;」に、リダイレクトを残さずに移動しました&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ja&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 古い版&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2026年2月20日 (金) 00:16時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;ja&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(相違点なし)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key mochiuwiki:diff:1.41:old-14351:rev-14352 --&gt;
&lt;/table&gt;</summary>
		<author><name>Wiki</name></author>
	</entry>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=JavaScript%E3%81%AE%E5%9F%BA%E7%A4%8E_-_Map&amp;diff=14351&amp;oldid=prev</id>
		<title>Wiki: ページの作成:「== 概要 == JavaScriptのMapは、ES2015 (ES6) で導入されたキーバリューペアのコレクションである。&lt;br&gt; 通常のObjectと異なり、キーとして文字列やSymbolだけでなく、オブジェクト、関数、数値等、任意の型を使用できる。&lt;br&gt; &lt;br&gt; キーの比較にはSameValueZeroアルゴリズムを採用しており、&lt;code&gt;NaN&lt;/code&gt; 同士を同一のキーとして扱うことができる。&lt;br&gt; 挿入した順序…」</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=JavaScript%E3%81%AE%E5%9F%BA%E7%A4%8E_-_Map&amp;diff=14351&amp;oldid=prev"/>
		<updated>2026-02-19T15:15:27Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「== 概要 == JavaScriptのMapは、ES2015 (ES6) で導入されたキーバリューペアのコレクションである。&amp;lt;br&amp;gt; 通常のObjectと異なり、キーとして文字列やSymbolだけでなく、オブジェクト、関数、数値等、任意の型を使用できる。&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; キーの比較にはSameValueZeroアルゴリズムを採用しており、&amp;lt;code&amp;gt;NaN&amp;lt;/code&amp;gt; 同士を同一のキーとして扱うことができる。&amp;lt;br&amp;gt; 挿入した順序…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 概要 ==&lt;br /&gt;
JavaScriptのMapは、ES2015 (ES6) で導入されたキーバリューペアのコレクションである。&amp;lt;br&amp;gt;&lt;br /&gt;
通常のObjectと異なり、キーとして文字列やSymbolだけでなく、オブジェクト、関数、数値等、任意の型を使用できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
キーの比較にはSameValueZeroアルゴリズムを採用しており、&amp;lt;code&amp;gt;NaN&amp;lt;/code&amp;gt; 同士を同一のキーとして扱うことができる。&amp;lt;br&amp;gt;&lt;br /&gt;
挿入した順序が仕様によって保証されており、反復処理においても挿入順に要素が返される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; プロパティで要素数を直接取得できるほか、&amp;lt;code&amp;gt;forEach&amp;lt;/code&amp;gt; や &amp;lt;code&amp;gt;for...of&amp;lt;/code&amp;gt; による反復処理、&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;keys()&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;values()&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;entries()&amp;lt;/code&amp;gt; によるイテレータ取得等、豊富な操作メソッドが用意されている。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ES2024では静的メソッド &amp;lt;code&amp;gt;Map.groupBy()&amp;lt;/code&amp;gt; が追加され、配列等のイテラブルをグループ化してMapとして返す操作が標準化された。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
また、弱参照版である &amp;lt;code&amp;gt;WeakMap&amp;lt;/code&amp;gt; も用意されており、キーへの外部参照がなくなった際にガベージコレクタが自動的にエントリを削除するため、&amp;lt;br&amp;gt;&lt;br /&gt;
メモリリークを防ぎつつプライベートデータの格納やDOM要素へのメタデータ付与に活用できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mapの作成 ==&lt;br /&gt;
Mapを作成する方法は主にコンストラクタを使用する1種類である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ES2024からは静的メソッド &amp;lt;code&amp;gt;Map.groupBy()&amp;lt;/code&amp;gt; によるグループ化も可能になった。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== コンストラクタ ====&lt;br /&gt;
&amp;lt;code&amp;gt;new Map()&amp;lt;/code&amp;gt; で空のMapを生成し、&amp;lt;code&amp;gt;new Map(iterable)&amp;lt;/code&amp;gt; で初期値を持つMapを生成する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; を省略すると TypeErrorが発生するため注意が必要である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
iterableを渡す場合、各要素は &amp;lt;code&amp;gt;[key, value]&amp;lt;/code&amp;gt; の形式でなければならない。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // 空のMapを生成&lt;br /&gt;
 const map1 = new Map();&lt;br /&gt;
 &lt;br /&gt;
 // 初期値を持つMapを生成 ([key, value] のペアの配列を渡す)&lt;br /&gt;
 const map2 = new Map([&lt;br /&gt;
    [&amp;quot;name&amp;quot;, &amp;quot;Alice&amp;quot;],&lt;br /&gt;
    [&amp;quot;age&amp;quot;,  30],&lt;br /&gt;
    [&amp;quot;city&amp;quot;, &amp;quot;Tokyo&amp;quot;]&lt;br /&gt;
 ]);&lt;br /&gt;
 &lt;br /&gt;
 console.log(map2.get(&amp;quot;name&amp;quot;));  // &amp;quot;Alice&amp;quot;&lt;br /&gt;
 console.log(map2.size);         // 3&lt;br /&gt;
 &lt;br /&gt;
 // Objectからの変換&lt;br /&gt;
 const obj  = { a: 1, b: 2, c: 3 };&lt;br /&gt;
 const map3 = new Map(Object.entries(obj));&lt;br /&gt;
 console.log(map3.get(&amp;quot;a&amp;quot;));  // 1&lt;br /&gt;
 &lt;br /&gt;
 // newなしではTypeError&lt;br /&gt;
 // const map4 = Map();  // TypeError: Constructor Map requires &amp;#039;new&amp;#039;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== Map.groupBy (ES2024) ====&lt;br /&gt;
&amp;lt;code&amp;gt;Map.groupBy(items, callback)&amp;lt;/code&amp;gt; は、イテラブルの各要素にコールバック関数を適用し、その戻り値をキー、対応する要素の配列を値とするMapを返す静的メソッドである。&amp;lt;br&amp;gt;&lt;br /&gt;
2024年3月以降の全モダンブラウザで利用可能である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
コールバック関数の戻り値はキーとして使用されるため、オブジェクトを含む任意の型を返すことができる点が &amp;lt;code&amp;gt;Object.groupBy()&amp;lt;/code&amp;gt; との違いである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Object.groupBy()&amp;lt;/code&amp;gt; はキーが文字列に変換されるのに対し、&amp;lt;code&amp;gt;Map.groupBy()&amp;lt;/code&amp;gt; はキーの型をそのまま保持する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 const inventory = [&lt;br /&gt;
    { name: &amp;quot;apple&amp;quot;,  type: &amp;quot;fruit&amp;quot;,     count: 5  },&lt;br /&gt;
    { name: &amp;quot;banana&amp;quot;, type: &amp;quot;fruit&amp;quot;,     count: 0  },&lt;br /&gt;
    { name: &amp;quot;carrot&amp;quot;, type: &amp;quot;vegetable&amp;quot;, count: 2  },&lt;br /&gt;
    { name: &amp;quot;daikon&amp;quot;, type: &amp;quot;vegetable&amp;quot;, count: 10 },&lt;br /&gt;
 ];&lt;br /&gt;
 &lt;br /&gt;
 // 文字列キーでグループ化&lt;br /&gt;
 const byType = Map.groupBy(inventory, (item) =&amp;gt; item.type);&lt;br /&gt;
 console.log(byType.get(&amp;quot;fruit&amp;quot;));&lt;br /&gt;
 // [ { name: &amp;quot;apple&amp;quot;, ... }, { name: &amp;quot;banana&amp;quot;, ... } ]&lt;br /&gt;
 &lt;br /&gt;
 // オブジェクトをキーとしてグループ化 (Map.groupByのみ可能)&lt;br /&gt;
 const restock = { restock: true  };&lt;br /&gt;
 const sufficient = { restock: false };&lt;br /&gt;
 &lt;br /&gt;
 const byRestock = Map.groupBy(inventory, (item) =&amp;gt;&lt;br /&gt;
    item.count &amp;gt; 0 ? sufficient : restock&lt;br /&gt;
 );&lt;br /&gt;
 console.log(byRestock.get(restock));&lt;br /&gt;
 // [ { name: &amp;quot;banana&amp;quot;, ... } ]&lt;br /&gt;
 &lt;br /&gt;
 // Object.groupByとの比較 (キーは文字列に変換される)&lt;br /&gt;
 const objGrouped = Object.groupBy(inventory, (item) =&amp;gt; item.type);&lt;br /&gt;
 console.log(objGrouped.fruit);  // Object.groupBy はドットアクセスで取得&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 要素の操作 ==&lt;br /&gt;
Mapには要素の追加、取得、確認、削除のためのメソッドが用意されている。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== set / get ====&lt;br /&gt;
&amp;lt;code&amp;gt;set(key, value)&amp;lt;/code&amp;gt; はMapにキーバリューペアを追加または更新するメソッドである。&amp;lt;br&amp;gt;&lt;br /&gt;
Mapインスタンス自身を返すため、メソッドチェーンで連続して呼び出すことができる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;get(key)&amp;lt;/code&amp;gt; は指定したキーに対応する値を返し、キーが存在しない場合は &amp;lt;u&amp;gt;undefined&amp;lt;/u&amp;gt; を返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 const map = new Map();&lt;br /&gt;
 &lt;br /&gt;
 // set : キーバリューペアを追加&lt;br /&gt;
 map.set(&amp;quot;name&amp;quot;, &amp;quot;Alice&amp;quot;);&lt;br /&gt;
 map.set(&amp;quot;age&amp;quot;,  30);&lt;br /&gt;
 &lt;br /&gt;
 // setはチェーン可能 (Mapインスタンス自身を返す)&lt;br /&gt;
 map.set(&amp;quot;city&amp;quot;, &amp;quot;Tokyo&amp;quot;).set(&amp;quot;country&amp;quot;, &amp;quot;Japan&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 // get : 値を取得&lt;br /&gt;
 console.log(map.get(&amp;quot;name&amp;quot;));    // &amp;quot;Alice&amp;quot;&lt;br /&gt;
 console.log(map.get(&amp;quot;age&amp;quot;));     // 30&lt;br /&gt;
&lt;br /&gt;
 // 存在しないキーはundefinedを返す&lt;br /&gt;
 console.log(map.get(&amp;quot;email&amp;quot;));   // undefined&lt;br /&gt;
&lt;br /&gt;
 // キーを更新する&lt;br /&gt;
 map.set(&amp;quot;age&amp;quot;, 31);&lt;br /&gt;
 console.log(map.get(&amp;quot;age&amp;quot;));     // 31&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== has / delete / clear ====&lt;br /&gt;
各メソッドの動作を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ has / delete / clearメソッドの動作&lt;br /&gt;
! メソッド !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;has(key)&amp;lt;/code&amp;gt; || 指定したキーがMapに存在するかを真偽値で返す。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;delete(key)&amp;lt;/code&amp;gt; || 指定したキーとその値をMapから削除する。&amp;lt;br&amp;gt;削除に成功した場合はtrue、キーが存在しなかった場合はfalseを返す。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;clear()&amp;lt;/code&amp;gt; || Map内の全ての要素を削除する。&amp;lt;br&amp;gt;戻り値は、&amp;lt;u&amp;gt;undefined&amp;lt;/u&amp;gt; である。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 const map = new Map([&lt;br /&gt;
    [&amp;quot;a&amp;quot;, 1],&lt;br /&gt;
    [&amp;quot;b&amp;quot;, 2],&lt;br /&gt;
    [&amp;quot;c&amp;quot;, 3],&lt;br /&gt;
 ]);&lt;br /&gt;
 &lt;br /&gt;
 // has: キーの存在確認&lt;br /&gt;
 console.log(map.has(&amp;quot;a&amp;quot;));   // true&lt;br /&gt;
 console.log(map.has(&amp;quot;z&amp;quot;));   // false&lt;br /&gt;
 &lt;br /&gt;
 // delete: 特定のキーを削除&lt;br /&gt;
 console.log(map.delete(&amp;quot;b&amp;quot;));  // true (削除成功)&lt;br /&gt;
 console.log(map.delete(&amp;quot;z&amp;quot;));  // false (存在しないキー)&lt;br /&gt;
 console.log(map.size);          // 2&lt;br /&gt;
 &lt;br /&gt;
 // clear: 全要素を削除&lt;br /&gt;
 map.clear();&lt;br /&gt;
 console.log(map.size);  // 0&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== sizeプロパティ ====&lt;br /&gt;
&amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; は読み取り専用のプロパティで、Mapに格納されているキーバリューペアの数を返す。&amp;lt;br&amp;gt;&lt;br /&gt;
Objectのサイズ取得には &amp;lt;u&amp;gt;Object.keys(obj).length&amp;lt;/u&amp;gt; が必要であるのに対し、Mapは &amp;lt;u&amp;gt;map.size&amp;lt;/u&amp;gt; で直接取得することができる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 const map = new Map([&lt;br /&gt;
    [&amp;quot;x&amp;quot;, 10],&lt;br /&gt;
    [&amp;quot;y&amp;quot;, 20],&lt;br /&gt;
    [&amp;quot;z&amp;quot;, 30],&lt;br /&gt;
 ]);&lt;br /&gt;
 &lt;br /&gt;
 console.log(map.size);  // 3&lt;br /&gt;
 &lt;br /&gt;
 map.set(&amp;quot;w&amp;quot;, 40);&lt;br /&gt;
 console.log(map.size);  // 4&lt;br /&gt;
 &lt;br /&gt;
 map.delete(&amp;quot;x&amp;quot;);&lt;br /&gt;
 console.log(map.size);  // 3&lt;br /&gt;
 &lt;br /&gt;
 // Objectとの比較&lt;br /&gt;
 const obj = { x: 10, y: 20, z: 30 };&lt;br /&gt;
 console.log(Object.keys(obj).length);  // 3 (Objectはこの方法が必要)&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== キーの特性 ==&lt;br /&gt;
Mapのキーはあらゆる型の値を使用できる点が、通常のObjectとの大きな違いである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== キーに使用できる型 ====&lt;br /&gt;
Mapのキーとして使用できる型を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Mapのキーに使用できる型&lt;br /&gt;
! 種別&lt;br /&gt;
! 内容&lt;br /&gt;
|-&lt;br /&gt;
| プリミティブ型 || 文字列、数値、真偽値、&amp;lt;u&amp;gt;undefined&amp;lt;/u&amp;gt;、&amp;lt;u&amp;gt;null&amp;lt;/u&amp;gt;、Symbol、BigInt&lt;br /&gt;
|-&lt;br /&gt;
| オブジェクト || 配列、関数、クラスインスタンス等、参照型全般&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;NaN&amp;lt;/code&amp;gt; || &amp;lt;u&amp;gt;NaN&amp;lt;/u&amp;gt; 自体もキーとして使用できる。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 const map = new Map();&lt;br /&gt;
 &lt;br /&gt;
 // プリミティブ型のキー&lt;br /&gt;
 map.set(&amp;quot;string&amp;quot;,    &amp;quot;文字列キー&amp;quot;);&lt;br /&gt;
 map.set(42,          &amp;quot;数値キー&amp;quot;);&lt;br /&gt;
 map.set(true,        &amp;quot;真偽値キー&amp;quot;);&lt;br /&gt;
 map.set(null,        &amp;quot;nullキー&amp;quot;);&lt;br /&gt;
 map.set(undefined,   &amp;quot;undefinedキー&amp;quot;);&lt;br /&gt;
 map.set(Symbol(&amp;quot;s&amp;quot;), &amp;quot;Symbolキー&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 // オブジェクトをキーとして使用&lt;br /&gt;
 const obj  = { id: 1 };&lt;br /&gt;
 const arr  = [1, 2, 3];&lt;br /&gt;
 const func = () =&amp;gt; {};&lt;br /&gt;
 map.set(obj,  &amp;quot;オブジェクトキー&amp;quot;);&lt;br /&gt;
 map.set(arr,  &amp;quot;配列キー&amp;quot;);&lt;br /&gt;
 map.set(func, &amp;quot;関数キー&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 // NaN をキーとして使用&lt;br /&gt;
 map.set(NaN, &amp;quot;NaNキー&amp;quot;);&lt;br /&gt;
 console.log(map.get(NaN));   // &amp;quot;NaNキー&amp;quot;&lt;br /&gt;
 console.log(map.size);       // 10&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== キーの同値比較 ====&lt;br /&gt;
MapのキーはSameValueZeroアルゴリズムで比較される。&amp;lt;br&amp;gt;&lt;br /&gt;
このアルゴリズムは厳密等価 (&amp;lt;code&amp;gt;===&amp;lt;/code&amp;gt;) と概ね同じだが、以下の点が異なる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;NaN&amp;lt;/code&amp;gt; 同士を同一視する&lt;br /&gt;
*: 厳密等価では &amp;lt;code&amp;gt;NaN === NaN&amp;lt;/code&amp;gt; が &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; になるが、SameValueZeroでは &amp;lt;code&amp;gt;NaN&amp;lt;/code&amp;gt; を同一キーとして扱う。&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;+0&amp;lt;/code&amp;gt; と &amp;lt;code&amp;gt;-0&amp;lt;/code&amp;gt; を同一視する&lt;br /&gt;
*: SameValueアルゴリズムでは &amp;lt;code&amp;gt;+0&amp;lt;/code&amp;gt; と &amp;lt;code&amp;gt;-0&amp;lt;/code&amp;gt; を区別するが、SameValueZeroでは同一視する。&lt;br /&gt;
* その他の値は厳密等価 (&amp;lt;code&amp;gt;===&amp;lt;/code&amp;gt;) と同じ比較を行う&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
SameValueZeroが採用された理由は、厳密等価を使用した場合に &amp;lt;code&amp;gt;NaN&amp;lt;/code&amp;gt; のキー判定が不可能になり、&amp;lt;br&amp;gt;&lt;br /&gt;
SameValueを使用した場合に &amp;lt;code&amp;gt;+0&amp;lt;/code&amp;gt; と &amp;lt;code&amp;gt;-0&amp;lt;/code&amp;gt; が別キーとして扱われ混乱を招くためである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 const map = new Map();&lt;br /&gt;
 &lt;br /&gt;
 // NaN 同士は同一視される (厳密等価とは異なる)&lt;br /&gt;
 map.set(NaN, &amp;quot;first&amp;quot;);&lt;br /&gt;
 map.set(NaN, &amp;quot;second&amp;quot;);   // 既存のNaNキーを上書き&lt;br /&gt;
 console.log(map.size);    // 1&lt;br /&gt;
 console.log(map.get(NaN)); // &amp;quot;second&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 // 参考: 厳密等価では NaN は NaN と等しくない&lt;br /&gt;
 console.log(NaN === NaN);  // false&lt;br /&gt;
 &lt;br /&gt;
 // +0 と -0 は同一視される&lt;br /&gt;
 map.set(+0, &amp;quot;zero&amp;quot;);&lt;br /&gt;
 map.set(-0, &amp;quot;minus zero&amp;quot;); // +0 のエントリを上書き&lt;br /&gt;
 console.log(map.size);     // 2 (NaN のエントリ + 0 のエントリ)&lt;br /&gt;
 console.log(map.get(0));   // &amp;quot;minus zero&amp;quot;&lt;br /&gt;
 console.log(map.get(-0));  // &amp;quot;minus zero&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 // オブジェクトキーは参照で比較される&lt;br /&gt;
 const obj1 = { id: 1 };&lt;br /&gt;
 const obj2 = { id: 1 };  // 内容は同じだが別オブジェクト&lt;br /&gt;
 map.set(obj1, &amp;quot;obj1&amp;quot;);&lt;br /&gt;
 map.set(obj2, &amp;quot;obj2&amp;quot;);&lt;br /&gt;
 console.log(map.size);        // 4 (obj1 と obj2 は別キー)&lt;br /&gt;
 console.log(map.get(obj1));   // &amp;quot;obj1&amp;quot;&lt;br /&gt;
 console.log(map.get(obj2));   // &amp;quot;obj2&amp;quot;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 反復処理 ==&lt;br /&gt;
Mapは挿入順に要素を反復処理するための複数の方法を提供している。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== forEach ====&lt;br /&gt;
&amp;lt;code&amp;gt;forEach(callback)&amp;lt;/code&amp;gt; は、Mapの各エントリに対してコールバック関数を呼び出す。&amp;lt;br&amp;gt;&lt;br /&gt;
コールバック関数の引数は &amp;lt;code&amp;gt;(value, key, map)&amp;lt;/code&amp;gt; の順である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;Arrayの &amp;lt;code&amp;gt;forEach&amp;lt;/code&amp;gt; と異なり、第1引数がvalueであることに注意が必要である。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 const map = new Map([&lt;br /&gt;
    [&amp;quot;name&amp;quot;, &amp;quot;Alice&amp;quot;],&lt;br /&gt;
    [&amp;quot;age&amp;quot;,  30],&lt;br /&gt;
    [&amp;quot;city&amp;quot;, &amp;quot;Tokyo&amp;quot;],&lt;br /&gt;
 ]);&lt;br /&gt;
 &lt;br /&gt;
 map.forEach((value, key) =&amp;gt; {&lt;br /&gt;
    console.log(`${key}: ${value}`);&lt;br /&gt;
 });&lt;br /&gt;
 // name: Alice&lt;br /&gt;
 // age: 30&lt;br /&gt;
 // city: Tokyo&lt;br /&gt;
 &lt;br /&gt;
 // 第3引数でMapインスタンス自体を受け取れる&lt;br /&gt;
 map.forEach((value, key, m) =&amp;gt; {&lt;br /&gt;
    console.log(m.size);  // 3 (毎回出力)&lt;br /&gt;
 });&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== for...of ====&lt;br /&gt;
&amp;lt;code&amp;gt;for...of&amp;lt;/code&amp;gt; を使用してMapを反復処理できる。&amp;lt;br&amp;gt;&lt;br /&gt;
MapのデフォルトイテレータはEntries (キーバリューペアの配列) を返すため、&amp;lt;code&amp;gt;for...of&amp;lt;/code&amp;gt; でそのまま分割代入が使用できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 const map = new Map([&lt;br /&gt;
    [&amp;quot;name&amp;quot;, &amp;quot;Alice&amp;quot;],&lt;br /&gt;
    [&amp;quot;age&amp;quot;,  30],&lt;br /&gt;
    [&amp;quot;city&amp;quot;, &amp;quot;Tokyo&amp;quot;],&lt;br /&gt;
 ]);&lt;br /&gt;
 &lt;br /&gt;
 // デフォルトイテレータは entries() と同等&lt;br /&gt;
 for (const [key, value] of map) {&lt;br /&gt;
    console.log(`${key}: ${value}`);&lt;br /&gt;
 }&lt;br /&gt;
 // name: Alice&lt;br /&gt;
 // age: 30&lt;br /&gt;
 // city: Tokyo&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== keys / values / entries ====&lt;br /&gt;
Mapは3種類のイテレータメソッドを提供している。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Mapの3種類のイテレータメソッド&lt;br /&gt;
! メソッド !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;keys()&amp;lt;/code&amp;gt; || 挿入順にキーを返すイテレータを生成する。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;values()&amp;lt;/code&amp;gt; || 挿入順に値を返すイテレータを生成する。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;entries()&amp;lt;/code&amp;gt; || 挿入順に &amp;lt;code&amp;gt;[key, value]&amp;lt;/code&amp;gt; のペアを返すイテレータを生成する。&amp;lt;br&amp;gt;Mapのデフォルトイテレータと同等&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 const map = new Map([&lt;br /&gt;
    [&amp;quot;a&amp;quot;, 1],&lt;br /&gt;
    [&amp;quot;b&amp;quot;, 2],&lt;br /&gt;
    [&amp;quot;c&amp;quot;, 3],&lt;br /&gt;
 ]);&lt;br /&gt;
 &lt;br /&gt;
 // keys() : キーのイテレータ&lt;br /&gt;
 for (const key of map.keys()) {&lt;br /&gt;
    console.log(key);  // &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // values() : 値のイテレータ&lt;br /&gt;
 for (const value of map.values()) {&lt;br /&gt;
    console.log(value);  // 1, 2, 3&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // entries() : [key, value]ペアのイテレータ&lt;br /&gt;
 for (const [key, value] of map.entries()) {&lt;br /&gt;
    console.log(`${key} =&amp;gt; ${value}`);  // &amp;quot;a =&amp;gt; 1&amp;quot;, &amp;quot;b =&amp;gt; 2&amp;quot;, &amp;quot;c =&amp;gt; 3&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 配列への変換 ====&lt;br /&gt;
Mapは &amp;lt;code&amp;gt;Array.from()&amp;lt;/code&amp;gt; または スプレッド構文 (&amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;) を使用して配列に変換できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 const map = new Map([&lt;br /&gt;
    [&amp;quot;x&amp;quot;, 10],&lt;br /&gt;
    [&amp;quot;y&amp;quot;, 20],&lt;br /&gt;
    [&amp;quot;z&amp;quot;, 30],&lt;br /&gt;
 ]);&lt;br /&gt;
 &lt;br /&gt;
 // Array.from()で変換&lt;br /&gt;
 const entries1 = Array.from(map);&lt;br /&gt;
 console.log(entries1);  // [[&amp;quot;x&amp;quot;, 10], [&amp;quot;y&amp;quot;, 20], [&amp;quot;z&amp;quot;, 30]]&lt;br /&gt;
 &lt;br /&gt;
 const keys1   = Array.from(map.keys());&lt;br /&gt;
 const values1 = Array.from(map.values());&lt;br /&gt;
 console.log(keys1);    // [&amp;quot;x&amp;quot;, &amp;quot;y&amp;quot;, &amp;quot;z&amp;quot;]&lt;br /&gt;
 console.log(values1);  // [10, 20, 30]&lt;br /&gt;
 &lt;br /&gt;
 // スプレッド構文で変換&lt;br /&gt;
 const entries2 = [...map];&lt;br /&gt;
 const keys2    = [...map.keys()];&lt;br /&gt;
 const values2  = [...map.values()];&lt;br /&gt;
 console.log(entries2);  // [[&amp;quot;x&amp;quot;, 10], [&amp;quot;y&amp;quot;, 20], [&amp;quot;z&amp;quot;, 30]]&lt;br /&gt;
 &lt;br /&gt;
 // Mapにfilterやmap等の配列メソッドを適用する場合&lt;br /&gt;
 const filtered = [...map].filter(([key, value]) =&amp;gt; value &amp;gt; 10);&lt;br /&gt;
 console.log(filtered);  // [[&amp;quot;y&amp;quot;, 20], [&amp;quot;z&amp;quot;, 30]]&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Object との比較 ==&lt;br /&gt;
MapとObjectはどちらもキーバリューペアを格納できるが、特性や用途に違いがある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Map と Object の比較&lt;br /&gt;
! 観点 !! Map !! Object&lt;br /&gt;
|-&lt;br /&gt;
| キーの型 || 任意の型 (オブジェクト、関数、NaN等を含む) || 文字列、Symbol のみ&lt;br /&gt;
|-&lt;br /&gt;
| 挿入順の保持 || 仕様で保証 || 実装依存 (整数キーは昇順、その他は挿入順が多い)&lt;br /&gt;
|-&lt;br /&gt;
| サイズ取得 || &amp;lt;code&amp;gt;map.size&amp;lt;/code&amp;gt; で直接取得 || &amp;lt;code&amp;gt;Object.keys(obj).length&amp;lt;/code&amp;gt; が必要&lt;br /&gt;
|-&lt;br /&gt;
| 反復処理 || &amp;lt;code&amp;gt;for...of&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;forEach&amp;lt;/code&amp;gt;、各種イテレータが利用可能 || &amp;lt;code&amp;gt;for...in&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;Object.keys()&amp;lt;/code&amp;gt; 等が必要&lt;br /&gt;
|-&lt;br /&gt;
| パフォーマンス || 追加・削除・反復処理が高速 (特に大規模データ) || 小規模データの読み取り中心では有利な場合がある。&lt;br /&gt;
|-&lt;br /&gt;
| JSON変換 || 非対応 (カスタム変換が必要) || &amp;lt;code&amp;gt;JSON.stringify()&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;JSON.parse()&amp;lt;/code&amp;gt; で直接対応&lt;br /&gt;
|-&lt;br /&gt;
| プロトタイプ || なし (意図しないキーの衝突リスクが低い) || &amp;lt;code&amp;gt;Object.prototype&amp;lt;/code&amp;gt; を継承 (意図しないキー衝突の可能性あり)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 使い分けの指針 ====&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ MapとObjectの使い分け&lt;br /&gt;
! 型 !! 場面 !! 理由&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | Map || キーの追加・削除が頻繁に発生する場合 || Mapはdeleteが高速であり、大量のエントリを扱う場合も効率的である。&lt;br /&gt;
|-&lt;br /&gt;
| キーとして文字列・Symbol以外を使用したい場合 || オブジェクトや関数、NaN等をキーとして使用する場合はMapが必要である。&lt;br /&gt;
|-&lt;br /&gt;
| 挿入順を確実に保持する必要がある場合 || Objectの挿入順保持はブラウザ依存であるため、仕様で保証されているMapを使用する。&lt;br /&gt;
|-&lt;br /&gt;
| 大規模データの反復処理が必要な場合 || Mapの反復処理はObjectより高速な場合があり、特に大規模データで顕著である。&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | Object || JSONとの相互変換が必要な場合 || &amp;lt;code&amp;gt;JSON.stringify()&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;JSON.parse()&amp;lt;/code&amp;gt; はObjectを直接サポートする。&lt;br /&gt;
|-&lt;br /&gt;
| 構造が固定されたレコードを扱う場合 || 固定フィールドを持つデータ構造にはObjectの方が直感的で読みやすい。&lt;br /&gt;
|-&lt;br /&gt;
| 小規模でキーが文字列の場合 || シンプルなキーバリューペアであればObjectの方が記述が簡潔になる場合がある。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== WeakMap ==&lt;br /&gt;
WeakMapは、キーを弱参照で保持するMap類似のコレクションである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== WeakMapとは ====&lt;br /&gt;
WeakMapはMapと異なり、キーをガベージコレクタが回収できる弱参照で保持する。&amp;lt;br&amp;gt;&lt;br /&gt;
キーへの外部参照がなくなると、ガベージコレクタが自動的に対応するエントリを削除するため、メモリリークを防ぐことができる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
WeakMapには以下の制限がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* キーはオブジェクトまたは未登録のSymbolのみ使用できる&lt;br /&gt;
*: プリミティブ型 (文字列、数値等) はキーとして使用できない。&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* 反復処理ができない&lt;br /&gt;
*: &amp;lt;code&amp;gt;keys()&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;values()&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;entries()&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;forEach()&amp;lt;/code&amp;gt; は存在しない。&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; プロパティがない&lt;br /&gt;
*: 格納されている要素数を取得する方法がない。&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;clear()&amp;lt;/code&amp;gt; メソッドがない&lt;br /&gt;
*: 全要素を一括削除する方法がない。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 基本操作 ====&lt;br /&gt;
WeakMapで使用できるメソッドは &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;has&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; の4つのみである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 const weakMap = new WeakMap();&lt;br /&gt;
 &lt;br /&gt;
 const key1 = { id: 1 };&lt;br /&gt;
 const key2 = { id: 2 };&lt;br /&gt;
 &lt;br /&gt;
 // set : エントリを追加&lt;br /&gt;
 weakMap.set(key1, &amp;quot;value1&amp;quot;);&lt;br /&gt;
 weakMap.set(key2, &amp;quot;value2&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 // get : 値を取得&lt;br /&gt;
 console.log(weakMap.get(key1));  // &amp;quot;value1&amp;quot;&lt;br /&gt;
 console.log(weakMap.get(key2));  // &amp;quot;value2&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 // has : キーの存在確認&lt;br /&gt;
 console.log(weakMap.has(key1));  // true&lt;br /&gt;
 &lt;br /&gt;
 // delete : エントリを削除&lt;br /&gt;
 weakMap.delete(key1);&lt;br /&gt;
 console.log(weakMap.has(key1));  // false&lt;br /&gt;
 &lt;br /&gt;
 // プリミティブ型はキーとして使用不可&lt;br /&gt;
 // weakMap.set(&amp;quot;string&amp;quot;, &amp;quot;value&amp;quot;);  // TypeError&lt;br /&gt;
 // weakMap.set(42, &amp;quot;value&amp;quot;);        // TypeError&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 使用例 ====&lt;br /&gt;
WeakMapは主に以下の2つのパターンで活用される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== プライベートデータの格納 =====&lt;br /&gt;
WeakMapを使うことで、クラスインスタンスに紐づいたプライベートデータを外部から隠蔽できる。&amp;lt;br&amp;gt;&lt;br /&gt;
ES2022以降は &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; プライベートフィールドが推奨されるが、WeakMapパターンは依然として有用な場面がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // WeakMap を使ったプライベートデータパターン&lt;br /&gt;
 const privateData = new WeakMap();&lt;br /&gt;
 &lt;br /&gt;
 class Person {&lt;br /&gt;
    constructor(name, age) {&lt;br /&gt;
       privateData.set(this, { name, age });&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    getName() {&lt;br /&gt;
       return privateData.get(this).name;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    getAge() {&lt;br /&gt;
       return privateData.get(this).age;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    greet() {&lt;br /&gt;
       const { name, age } = privateData.get(this);&lt;br /&gt;
       return `Hello, I&amp;#039;m ${name}, ${age} years old.`;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 const alice = new Person(&amp;quot;Alice&amp;quot;, 30);&lt;br /&gt;
 console.log(alice.getName());  // &amp;quot;Alice&amp;quot;&lt;br /&gt;
 console.log(alice.greet());    // &amp;quot;Hello, I&amp;#039;m Alice, 30 years old.&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 // privateData は外部からアクセスできない&lt;br /&gt;
 // alice インスタンスが参照されなくなると、WeakMap のエントリも自動削除される&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== DOM要素へのメタデータ付与 =====&lt;br /&gt;
WeakMapを使用して、DOM要素にメタデータを安全に付与できる。&amp;lt;br&amp;gt;&lt;br /&gt;
DOM要素がドキュメントから削除されると、WeakMapのエントリも自動的にガベージコレクトされるため、メモリリークが発生しない。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 const elementMetadata = new WeakMap();&lt;br /&gt;
 &lt;br /&gt;
 function registerElement(element, metadata) {&lt;br /&gt;
    elementMetadata.set(element, metadata);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function getMetadata(element) {&lt;br /&gt;
    return elementMetadata.get(element);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // DOM要素にメタデータを付与&lt;br /&gt;
 const button = document.querySelector(&amp;quot;#myButton&amp;quot;);&lt;br /&gt;
 registerElement(button, {&lt;br /&gt;
    clickCount: 0,&lt;br /&gt;
    createdAt:  Date.now(),&lt;br /&gt;
    label:      &amp;quot;送信ボタン&amp;quot;,&lt;br /&gt;
 });&lt;br /&gt;
 &lt;br /&gt;
 button.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
    const meta = getMetadata(button);&lt;br /&gt;
    meta.clickCount++;&lt;br /&gt;
    console.log(`クリック回数: ${meta.clickCount}`);&lt;br /&gt;
 });&lt;br /&gt;
 &lt;br /&gt;
 // button 要素が DOM から削除されると、WeakMap のエントリも自動削除される&lt;br /&gt;
 // button.remove();&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
以下に、MapとWeakMapの主な違いをまとめる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Map と WeakMapの比較&lt;br /&gt;
! 観点 !! Map !! WeakMap&lt;br /&gt;
|-&lt;br /&gt;
| キーの型 || 任意の型 || オブジェクト、未登録Symbol のみ&lt;br /&gt;
|-&lt;br /&gt;
| 反復処理 || 可能 (forEach, for...of 等) || 不可能&lt;br /&gt;
|-&lt;br /&gt;
| size プロパティ || あり || なし&lt;br /&gt;
|-&lt;br /&gt;
| clear メソッド || あり || なし&lt;br /&gt;
|-&lt;br /&gt;
| GC連動 || なし (強参照) || あり (弱参照)&lt;br /&gt;
|-&lt;br /&gt;
| 主な用途 || 一般的なキーバリューストア || プライベートデータ、DOM メタデータ、キャッシュ&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 関連情報 ==&lt;br /&gt;
* [[JavaScriptの基礎 - Set]]&lt;br /&gt;
*: Set、WeakSet、ES2025集合演算&lt;br /&gt;
* [[JavaScriptの基礎 - イテレータとジェネレータ]]&lt;br /&gt;
*: イテレータプロトコル、ジェネレータ、ES2025 Iterator Helpers&lt;br /&gt;
* [[JavaScriptの基礎 - オブジェクトリテラル]]&lt;br /&gt;
*: オブジェクトの基本操作、プロパティアクセス&lt;br /&gt;
* [[JavaScriptの基礎 - 配列の反復メソッド]]&lt;br /&gt;
*: forEach, map, filter, reduce等の反復処理メソッド&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#seo:&lt;br /&gt;
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki&lt;br /&gt;
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板&lt;br /&gt;
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux&lt;br /&gt;
|image=/resources/assets/MochiuLogo_Single_Blue.png&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:Web]]&lt;/div&gt;</summary>
		<author><name>Wiki</name></author>
	</entry>
</feed>