WeakMap
WeakMap はキーと値の組の集合ですが、キーはオブジェクトまたは非登録シンボルでなければならず、値は任意の JavaScript 型で、キーへの強い参照を生成しません。つまり、WeakMap 内のキーとしてのオブジェクトが存在しても、そのオブジェクトがガベージコレクションされる可能性があります。キーとして使用されたオブジェクトが回収されると、そのオブジェクトに対応する値は、他の場所で強く参照されていない限り、どの WeakMap においても同様にガベージコレクションの対象となります。WeakMap のキーとして使用することができる唯一のプリミティブ型はシンボル(正確に言えば、非登録シンボル)です。非登録シンボルは一意性が保証され、再生成されないためです。
WeakMapは、値がキーを参照している場合でも、キーとなるオブジェクトがガベージコレクションされるのを妨げない方法で、データとオブジェクトを関連付けることができます。ただし、WeakMapはキーの生存状態を監視できないため、列挙をすることができません。WeakMap がキーを列挙するメソッドを公開した場合、そのリストはガベージコレクションの状態に依存するため、不確定性が生じます。キーの列挙を行いたいのであれば、WeakMap ではなく Map を使用してください。
WeakMap について詳しく知るには、 WeakMap オブジェクトのガイド(キー付きコレクション内)を参照してください。
対応ブラウザ
| 機能 | デスクトップ | モバイル | ||||
|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Safari | Chrome Android | Safari iOS | |
| 36 | 12 | 6 | 8 | 36 | 8 | |
| WeakMap() コンストラクターは、WeakMap オブジェクトを生成します。 | 36 | 12 | 6 | 8 | 36 | 8 |
WeakMap.WeakMap.iterable allowed `新しい WeakMap(反復可能)` | 38 | 12 | 36 | 9 | 38 | 9 |
WeakMap.WeakMap.null allowed `新しいWeakMap(null)` | 36 | 12 | 37 | 8 | 36 | 8 |
| delete() は WeakMap インスタンスのメソッドで、この WeakMap からキーで指定された項目を削除します。 | 36 | 12 | 6 | 8 | 36 | 8 |
| get() は WeakMap インスタンスのメソッドで、この WeakMap 内のキーに対応する値を返します。該当するキーが存在しない場合は undefined を返します。オブジェクトの値は、コピーではなく、最初に格納されたときの参照と同じものが返されます。そのため、返されたオブジェクトに変更を行うと、その参照が保持されている場所(WeakMap の中を含む)すべてに反映されます。 | 36 | 12 | 6 | 8 | 36 | 8 |
| has() は WeakMap インスタンスのメソッドで、指定されたキーをもつ要素が WeakMap オブジェクト内に存在するかどうかを示す論理値を返します。 | 36 | 12 | 6 | 8 | 36 | 8 |
| set() は WeakMap インスタンスのメソッドで、指定されたキーと値をもつ新しい項目を WeakMap オブジェクトへ追加します。すでにそのキーが存在する場合は、項目を更新します。 | 36 | 12 | 6 | 8 | 36 | 8 |
WeakMap.symbol as keys 未登録のシンボルをキーとして使用 | 109 | 109 | 146 | 16.4 | 109 | 16.4 |
- Firefox 38 より前のバージョンでは、このメソッドは key パラメータがオブジェクトでない場合に `TypeError` を投げていた。これはバージョン 38 以降で修正され、ES2015 標準に従って `false` を返すようになりました。
- Firefox 38 より前のバージョンでは、このメソッドは key パラメータがオブジェクトでない場合に `TypeError` を投げていた。しかし、ES2015 仕様では、代わりに `undefined` を返すように指定されています。さらに、`WeakMap.prototype.get` はオプションの第2引数をフォールバック値として受け入れていましたが、これは標準ではありません。どちらの非標準的な動作もバージョン38以降では削除されている。
- Firefox 38 より前のバージョンでは、このメソッドは key パラメータがオブジェクトでない場合に `TypeError` を投げていた。これはバージョン 38 以降で修正され、ES2015 標準に従って `false` を返すようになりました。
- Firefox 38 より前のバージョンでは、このメソッドは key パラメータがオブジェクトでない場合に `TypeError` を投げていた。これはバージョン 38 以降で修正され、ES2015 標準に従って `false` を返すようになりました。
基本構文
const privateData = new WeakMap();
class User {
constructor(name) {
privateData.set(this, { name });
}
getName() {
return privateData.get(this).name;
}
} ライブデモ
Check whether an object is processed
efficiency to manage.. with object that processed or or WeakMap.
実務での使いどころ
-
WeakMap の活用
WeakMap はキーと値の組の集合ですが、キーはオブジェクトまたは非登録シンボルでなければならず、値は任意の JavaScript 型で、キーへの強い参照を生成しません。
注意点
- 特になし。すべての主要ブラウザで安定して動作する。
アクセシビリティ
- JavaScript による動的更新時は、aria-live リージョンで変更をスクリーンリーダーに通知する。