JavaScript WeakMap の使い方の詳しい説明

JavaScript WeakMap の使い方の詳しい説明

WeakMap オブジェクトは、キーが弱参照であるキー/値のペアのコレクションです。キーはオブジェクトである必要がありますが、値は何でもかまいません。

文法

新しい WeakMap([反復可能])

パラメータ

反復可能
Iterable は、要素がキーと値のペアである配列 (2 要素の配列) またはその他の反復可能なオブジェクトです。各キーと値のペアが新しい WeakMap に追加されます。 null は未定義として扱われます。

説明する

WeakMap のキーは Object 型のみにすることができます。 プリミティブ データ型 (Symbol など) はキーとして使用できません。

なぜ WeakMap なのか?

JavaScript では、4 つの API メソッドで 2 つの配列 (キー用と値用) を共有することでマップ API を実装できます。このようなマップに値を設定すると、キーと値の両方が両方の配列の末尾に追加されます。これにより、2 つの配列内のキーと値のインデックスが対応するようになります。マップから値を取得するときは、すべてのキーを走査し、インデックスを使用して、格納された値の配列から対応する値を取得する必要があります。

ただし、このような実装には 2 つの大きな欠点があります。まず、割り当て操作と検索操作の両方で、マッチングのために配列全体を走査する必要があるため、時間の計算量は O(n) (n はキーと値のペアの数) になります。もう 1 つの欠点は、配列には常に各キーと値への参照が含まれるため、メモリ リークが発生する可能性があることです。このような参照は、他の参照が存在しない場合でも、ガベージ コレクション アルゴリズムによる再利用を妨げます。

対照的に、ネイティブ WeakMap は各キー オブジェクトへの「弱参照」を保持します。つまり、他の参照が存在しない場合でもガベージ コレクションを正しく実行できます。ネイティブ WeakMap の構造は特殊かつ効果的であり、マッピングに使用されるキーはリサイクルされていない場合にのみ有効です。

この弱参照のため、WeakMap のキーは列挙可能ではありません (すべてのキーを指定する方法はありません)。キーが列挙可能な場合、そのリストはガベージ コレクションの対象となり、未定義の結果になります。したがって、このタイプのオブジェクトのキー値のリストが必要な場合は、マップを使用する必要があります。

基本的に、オブジェクトにデータを追加し、ガベージ コレクション メカニズムに干渉したくない場合は、WeakMap を使用できます。

財産

  • 弱いマップの長さ

長さプロパティの値は 0 です。

  • WeakMap.プロトタイプ

WeakMap コンストラクターのプロトタイプ。 すべての WeakMap オブジェクトに属性を追加できます。

WeakMapインスタンス

すべての WeakMap インスタンスは WeakMap.prototype から継承します。

財産

WeakMap.プロトタイプ.コンストラクタ
WeakMap インスタンスを作成するためのプロトタイプ関数を返します。 WeakMap 関数がデフォルトです。

方法

  • WeakMap.prototype.delete(キー)

キーに関連付けられたオブジェクトを削除します。実行後、WeakMap.prototype.has(key) は false を返します。

  • WeakMap.prototype.get(キー)

キーに関連付けられたオブジェクトを返します。キーに関連付けられたオブジェクトがない場合、undefined を返します。

  • WeakMap.prototype.has(キー)

キーがオブジェクトに関連付けられているかどうかに基づいてブール値を返します。

  • WeakMap.prototype.set(キー、値)

WeakMap にキーに関連付けられたオブジェクトのセットを設定し、この WeakMap オブジェクトを返します。


WeakMapの使用

定数wm1 = 新しいWeakMap()、
   wm2 = 新しい WeakMap()、
   wm3 = 新しい WeakMap();
定数o1 = {},
   o2 = 関数(){},
   o3 = ウィンドウ;

wm1.set(o1, 37);
wm1.set(o2, "azerty");
wm2.set(o1, o2); // 値はオブジェクトや関数など何でも構いません wm2.set(o3, undefined);
wm2.set(wm1, wm2); // キーと値は任意のオブジェクト、別の WeakMap オブジェクトでもかまいません wm1.get(o2); // "azerty"
wm2.get(o2); // undefined、wm2 にキー o2 はありません wm2.get(o3); // undefined、値は undefined です

wm1.has(o2); // 真
wm2.has(o2); // 偽
wm2.has(o3); // true (値が未定義の場合でも)

wm3.set(o1, 37);
wm3.get(o1); // 37

wm1.has(o1); // 真
wm1.delete(o1);
wm1.has(o1); // 偽

.clear() メソッドを持つ WeakMap クラスを実装する

クラス ClearableWeakMap {
 コンストラクタ(init) {
  this._wm = 新しい WeakMap(init)
 }
 クリア() {
  this._wm = 新しい WeakMap()
 }
 削除(k) {
  this._wm.delete(k) を返します
 }
 取得(k) {
  this._wm.get(k) を返します
 }
 持っている(k) {
  this._wm.has(k) を返す
 }
 セット(k, v) {
  this._wm.set(k, v)
  これを返す
 }
}

仕様

仕様状態コメント
ECMAScript 2015 (第 6 版、ECMA-262)
弱いマップ
標準初期定義。
ECMAスクリプト (ECMA-262)
弱いマップ
生活水準

上記は、JavaScript WeakMap の使い方の詳しい説明の詳しい内容です。JavaScript WeakMap の詳細については、123WORDPRESS.COM の他の関連記事にも注目してください。

以下もご興味があるかもしれません:
  • JavaScript における Object、map、weakmap の違いの分析
  • JavaScript における Map 型と WeakMap 型の使用に関する詳細な説明

<<:  HTTP および HTTP コラボレーション Web サーバー アクセス フロー図

>>:  MySQL 5.7 スレーブノードからマルチスレッド マスター スレーブ レプリケーションを構成する方法の詳細な説明

推薦する

WeChatアプレットはシンプルなチャットルームを実装します

この記事では、WeChatアプレットの具体的なコードを共有し、簡単なチャットルームを実装します。具体...

Vue3 でパンくず関数コンポーネントをカプセル化するいくつかの方法

目次序文1. パンくずリストはなぜ必要なのでしょうか? 2. 一次包装1. 実装のアイデア2. コー...

遭遇したいくつかのブラウザ互換性の問題について簡単に説明します

背景ブラウザの互換性の問題を解決するのは非常に面倒なことです。高度な技術はそれほど必要ありませんが、...

MySQL での実行計画の詳細分析

序文効率的なSQL文の書き方は、Explain実行計画の分析と切り離せません。実行計画とは何か、効率...

VMware Workstation のダウンロードとインストールの詳細なチュートリアル

仮想マシンは非常に便利なテストソフトウェアです。ハードウェアに損傷を与えることなく、さまざまなテスト...

Vue における LocalStorage と SessionStorage の違いと使い方

目次LocalStorageとはSessionStorageとはLocalStorage と Ses...

JavaScript における clientWidth、offsetWidth、scrollWidth の違い

1. コンセプトこれらはすべて Element の属性であり、要素の幅を示します。 Element....

Vue プロジェクトで mock.js を使用するための完全な手順

Vue プロジェクトで mock.js を使用する開発ツールの選択: Vscode 1. コマンドラ...

MySQL で数千万のテストデータを含むテストデータベースを作成する方法

場合によっては、MySQL が公式に提供しているテスト ライブラリに基づいてテスト データを作成し、...

Tencent Cloud で HTTPS を無料で導入する方法

最近、WeChatアプレットを書いていたとき、WeChatアプレットではすべてのリクエストインターフ...

自動ロック画面機能を実現するjs

1. 使用シナリオこのような要件があるため、システムが開発されました。ユーザーがデスクトップを離れ...

ポップアップ効果を実現するにはjsを使用します

この記事の例では、ポップアップ効果を実現するためのjsの具体的なコードを参考までに共有しています。具...

Zabbixリモートコマンド実行の詳細な例

目次1つ。環境二。予防三つ。例Zabbix トリガーがしきい値に達すると、アラート メッセージの送信...

ウェブフロントエンド開発者が知っておくべき 9 つの実用的な CSS プロパティ

1. 角を丸くする今日の Web デザインは、常に最新の開発テクノロジーに追随しており、HTML5 ...

Navicat は CSV データを MySQL にインポートします

この記事では、Navicatを使用してcsvデータをmysqlにインポートする方法を参考までに紹介し...