JS の WeakMaps とは何ですか?

Susan Sarandon
リリース: 2024-12-27 08:45:10
オリジナル
241 人が閲覧しました

What are WeakMaps in JS?

JavaScript の WeakMap は、キーが オブジェクト である必要があるキーと値のペアのコレクション、およびこれらへの参照です。キーが「弱い」です。これは、キー オブジェクトへの参照が他にない場合、それがまだ WeakMap 内にある場合でも、ガベージ コレクションできることを意味します。


主な機能

  1. キーはオブジェクトである必要があります:

    • プリミティブ値 (数値、文字列、ブール値など) はキーとして使用できません。
    • オブジェクトと関数のみがキーとして許可されます。
  2. 弱い参照:

    • WeakMap の主要なオブジェクトは弱く保持されます。
    • キーへの参照が他に存在しない場合、キーと値のペアは WeakMap から自動的に削除されます。
  3. 反復不可能です:

    • WeakMap には forEach のようなメソッドがなく、for...of や Object.keys() のような構造を使用してループすることはできません。
    • これは、ガベージ コレクション プロセスにより、すべてのエントリを確実にリストすることが不可能になるためです。
  4. 個人データに役立ちます:

    • WeakMap は、プライベート データを公開せずにオブジェクトに関連付けるためによく使用されます。

構文

const weakMap = new WeakMap();
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

メソッド

Method Description
weakMap.set(key, value) Adds a new key-value pair or updates an existing key.
weakMap.get(key) Retrieves the value associated with the key.
weakMap.has(key) Checks if the key exists in the WeakMap.
weakMap.delete(key) Removes the key-value pair associated with the key.

基本的な使い方

const weakMap = new WeakMap();
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ガベージコレクション

const weakMap = new WeakMap();

const obj1 = { name: "Alice" };
const obj2 = { name: "Bob" };

// Adding key-value pairs
weakMap.set(obj1, "Data for Alice");
weakMap.set(obj2, "Data for Bob");

// Accessing values
console.log(weakMap.get(obj1)); // Output: "Data for Alice"

// Checking existence
console.log(weakMap.has(obj2)); // Output: true

// Removing a key-value pair
weakMap.delete(obj2);
console.log(weakMap.has(obj2)); // Output: false
ログイン後にコピー
ログイン後にコピー

使用例

  1. プライベート データ ストレージ:
    • プライベート データをオブジェクトに関連付け、他の場所で公開されたりアクセスされたりしないようにします。
let obj = { key: "value" };
const weakMap = new WeakMap();
weakMap.set(obj, "Some data");

// Remove all references to `obj`
obj = null;

// The `WeakMap` entry for `obj` is automatically removed by garbage collection.
ログイン後にコピー
ログイン後にコピー
  1. DOM ノードのメタデータ:
    • ガベージ コレクションを妨げずに、DOM 要素に関連するメタデータを保存します。
const privateData = new WeakMap();

class User {
    constructor(name) {
        privateData.set(this, { name });
    }

    getName() {
        return privateData.get(this).name;
    }
}

const user = new User("Alice");
console.log(user.getName()); // Output: "Alice"
ログイン後にコピー
ログイン後にコピー

メリット

  • メモリ効率: 参照されていないキーの自動削除により、メモリを効率的に管理できます。
  • カプセル化: データをプライベートかつ安全に保存する方法を提供します。
  • メモリ リークなし: キーのガベージ コレクションを許可することで、偶発的なメモリ リークを防ぎます。

制限事項

  1. 反復不可能:
    • すべてのキーまたは値をリストすることはできません。
  2. オブジェクト キーのみ:
    • プリミティブキーはサポートされていません。
  3. 限定された使用例:
    • 保存されたデータへの列挙または完全なアクセスが必要なシナリオには適していません。

要約すると、WeakMap は、弱い参照とプライベート関連付けが必要なシナリオ向けに設計された特殊なコレクションです。

Map と WeakMap の違い

JavaScript における MapWeakMap の主な違いは、キーの処理、ガベージ コレクション、および機能にあります。詳細な比較は次のとおりです:


主な違い

機能
Feature Map WeakMap
Key Types Keys can be any type: objects, primitives. Keys must be objects.
Garbage Collection Does not rely on garbage collection; keys persist. Keys are held weakly and can be garbage-collected.
Iteration Iterable (can use for...of, forEach, etc.). Not iterable (cannot list keys or values).
Size Property Has a size property to get the number of entries. No size property available.
Use Case General-purpose key-value storage. Specialized for associating metadata or private data with objects.
Performance Slightly slower due to strong key references. Faster for memory-sensitive operations due to weak references.
地図 ウィークマップ キーの種類 キーは、オブジェクト、プリミティブなど、任意のタイプにすることができます。 キーはオブジェクトである必要があります。 ガベージ コレクション ガベージ コレクションに依存しません。キーは保持されます。 キーは弱く保持されており、ガベージ コレクションされる可能性があります。 反復 反復可能 (for...of、forEach などを使用可能)。 反復可能ではありません (キーまたは値をリストできません)。 サイズプロパティ エントリ数を取得するサイズ プロパティがあります。 使用可能なサイズ プロパティがありません。 使用例 汎用のキーと値のストレージ。 メタデータまたはプライベート データとオブジェクトの関連付けに特化しています。 パフォーマンス 強力なキー参照のため、わずかに遅くなります。 弱い参照により、メモリに依存する操作が高速になります。 テーブル>

機能の比較

1.キーの種類

  • Map: オブジェクトとプリミティブ型 (文字列、数値、ブール値など) の両方をキーとして受け入れます。
  • WeakMap: オブジェクトのみをキーとして受け入れます。プリミティブは許可されません。
const weakMap = new WeakMap();
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

2.ガベージコレクション

  • Map: キーへの強い参照を保持し、キーがマップ内に存在する限りガベージ コレクションされないようにします。
  • WeakMap: キーへの弱い参照を保持し、他に参照がない場合にガベージ コレクションできるようにします。
const weakMap = new WeakMap();

const obj1 = { name: "Alice" };
const obj2 = { name: "Bob" };

// Adding key-value pairs
weakMap.set(obj1, "Data for Alice");
weakMap.set(obj2, "Data for Bob");

// Accessing values
console.log(weakMap.get(obj1)); // Output: "Data for Alice"

// Checking existence
console.log(weakMap.has(obj2)); // Output: true

// Removing a key-value pair
weakMap.delete(obj2);
console.log(weakMap.has(obj2)); // Output: false
ログイン後にコピー
ログイン後にコピー

3.反復

  • マップ: 反復可能。 for...of、.keys()、.values()、.entries()、または .forEach() を使用して、その内容を反復処理できます。
  • WeakMap: 反復可能ではありません。すべてのキー、値、またはエントリを取得するメソッドはありません。
let obj = { key: "value" };
const weakMap = new WeakMap();
weakMap.set(obj, "Some data");

// Remove all references to `obj`
obj = null;

// The `WeakMap` entry for `obj` is automatically removed by garbage collection.
ログイン後にコピー
ログイン後にコピー

4.サイズプロパティ

  • Map: エントリの数を返すサイズ プロパティを提供します。
  • WeakMap: 反復可能ではなく、エントリが弱参照されるため、サイズ プロパティがありません。
const privateData = new WeakMap();

class User {
    constructor(name) {
        privateData.set(this, { name });
    }

    getName() {
        return privateData.get(this).name;
    }
}

const user = new User("Alice");
console.log(user.getName()); // Output: "Alice"
ログイン後にコピー
ログイン後にコピー

使用例

地図を使用する場合

  • 汎用のキーと値のストレージ。
  • キーと値の列挙または反復が必要なシナリオ。
  • キーはプリミティブまたはオブジェクトの場合があります。

例:

const metadata = new WeakMap();

function trackElement(element) {
    metadata.set(element, { clicks: 0 });
}

function incrementClicks(element) {
    const data = metadata.get(element);
    if (data) {
        data.clicks++;
    }
}

const button = document.createElement("button");
trackElement(button);
incrementClicks(button);
console.log(metadata.get(button)); // Output: { clicks: 1 }
ログイン後にコピー

WeakMap を使用する場合

  • ガベージ コレクションを妨げずに、メタデータまたはプライベート データをオブジェクトに関連付ける必要がある場合。
  • キーの有効期間が、関連付けられた値の有効期間を決定する必要がある場合に最適です。

例:

const map = new Map();
map.set(1, "value"); // Allowed
map.set("key", "value"); // Allowed
map.set({}, "value"); // Allowed

const weakMap = new WeakMap();
weakMap.set({}, "value"); // Allowed
weakMap.set(1, "value"); // TypeError: Invalid value used as weak map key
ログイン後にコピー

概要

機能
Feature Map WeakMap
Flexibility General-purpose, flexible. Specialized, limited use case.
Performance Persistent key references. Memory-efficient with weak references.
Suitability Iteration and long-term storage. Private data and ephemeral relationships.
地図 ウィークマップ 柔軟性 汎用、柔軟。 特殊で限定された使用例。 パフォーマンス 永続的なキー参照。 弱い参照を使用するとメモリ効率が向上します。 適合性 反復と長期保存。 プライベート データと一時的な関係。

以上がJS の WeakMaps とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート