Rumah >hujung hadapan web >tutorial js >Apakah WeakMaps dalam JS?

Apakah WeakMaps dalam JS?

Susan Sarandon
Susan Sarandonasal
2024-12-27 08:45:10241semak imbas

What are WeakMaps in JS?

Sebuah WeakMap dalam JavaScript ialah koleksi pasangan nilai kunci di mana kunci diperlukan untuk menjadi objek dan rujukan kepada ini kunci adalah "lemah." Ini bermakna jika tiada rujukan lain kepada objek utama, ia boleh dikumpul sampah, walaupun ia masih dalam WeakMap.


Ciri Utama

  1. Kunci mestilah objek:

    • Nilai primitif (seperti nombor, rentetan atau boolean) tidak boleh digunakan sebagai kunci.
    • Hanya objek dan fungsi dibenarkan sebagai kunci.
  2. Rujukan lemah:

    • Objek utama dalam WeakMap dipegang dengan lemah.
    • Jika tiada rujukan lain wujud pada kunci, pasangan nilai kunci akan dialih keluar secara automatik daripada WeakMap.
  3. Tidak boleh diubah:

    • WeakMap tidak mempunyai kaedah seperti forEach, dan ia tidak boleh digelung menggunakan binaan seperti for...of atau Object.keys().
    • Ini kerana proses kutipan sampah menyebabkan mustahil untuk menyenaraikan semua entri dengan pasti.
  4. Berguna untuk data peribadi:

    • WeakMap sering digunakan untuk mengaitkan data peribadi dengan objek tanpa mendedahkannya.

Sintaks

const weakMap = new WeakMap();

Kaedah

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.

Contoh

Penggunaan Asas

const weakMap = new WeakMap();

Pengumpulan Sampah

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

Kes Penggunaan

  1. Storan Data Peribadi:
    • Kaitkan data peribadi dengan objek, memastikan ia tidak terdedah atau boleh diakses di tempat lain.
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. Metadata Nod DOM:
    • Simpan metadata yang berkaitan dengan elemen DOM tanpa menghalang pengumpulan sampah.
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"

Kelebihan

  • Kecekapan Memori: Pembuangan automatik kekunci yang tidak dirujuk membantu mengurus ingatan dengan berkesan.
  • Encapsulation: Menyediakan cara untuk menyimpan data secara peribadi dan selamat.
  • Tiada Kebocoran Memori: Mengelakkan kebocoran memori secara tidak sengaja dengan membenarkan pengumpulan kunci sampah.

Penghadan

  1. Tidak boleh diulang:
    • Tidak boleh menyenaraikan semua kunci atau nilai.
  2. Kekunci Objek Sahaja:
    • Tidak menyokong kunci primitif.
  3. Kes Penggunaan Terhad:
    • Tidak sesuai untuk senario yang memerlukan penghitungan atau akses penuh kepada data yang disimpan.

Ringkasnya, WeakMap ialah koleksi khusus yang direka untuk senario di mana rujukan lemah dan persatuan persendirian diperlukan.

Perbezaan antara Map dan WeakMap

Perbezaan utama antara Peta dan WeakMap dalam JavaScript terletak pada pengendalian kunci, pengumpulan sampah dan kefungsian mereka. Berikut ialah perbandingan terperinci:


Perbezaan Utama

Ciri
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.
Peta WeakMap Jenis Utama Kunci boleh menjadi apa-apa jenis: objek, primitif. Kunci mestilah objek. Pengumpulan Sampah Tidak bergantung pada kutipan sampah; kunci kekal. Kunci dipegang lemah dan boleh dikumpul sampah. Lelaran Iterable (boleh digunakan untuk...of, forEach, dsb.). Tidak boleh diubah (tidak boleh menyenaraikan kunci atau nilai). Harta Saiz Mempunyai sifat saiz untuk mendapatkan bilangan entri. Tiada sifat saiz tersedia. Kes Penggunaan Storan nilai kunci tujuan umum. Khusus untuk mengaitkan metadata atau data peribadi dengan objek. Prestasi Lebih perlahan kerana rujukan utama yang kukuh. Lebih pantas untuk operasi sensitif memori kerana rujukan yang lemah. table>

Perbandingan Ciri

1. Jenis Utama

  • Peta: Menerima kedua-dua objek dan jenis primitif (seperti rentetan, nombor, boolean) sebagai kunci.
  • WeakMap: Hanya menerima objek sebagai kunci. Primitif tidak dibenarkan.
const weakMap = new WeakMap();

2. Kutipan Sampah

  • Peta: Mengekalkan rujukan kukuh kepada kunci, menghalangnya daripada dikumpul sampah selagi ia wujud dalam peta.
  • WeakMap: Memegang rujukan yang lemah kepada kekunci, membenarkannya untuk dikumpul sampah jika tiada rujukan lain.
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. Lelaran

  • Peta: Boleh diulang. Anda boleh menggunakan for...of, .keys(), .values(), .entry(), atau .forEach() untuk mengulangi kandungannya.
  • Peta Lemah: Tidak boleh diubah. Tiada kaedah untuk mendapatkan semula semua kunci, nilai atau entri.
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. Hartanah Saiz

  • Peta: Menyediakan sifat saiz yang mengembalikan bilangan entri.
  • WeakMap: Tidak mempunyai sifat saiz kerana ia tidak boleh diubah dan entri dirujuk dengan lemah.
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"

Kes Penggunaan

Bila Gunakan Peta

  • Storan nilai kunci tujuan am.
  • Senario yang memerlukan penghitungan atau lelaran kunci dan nilai.
  • Kunci mungkin primitif atau objek.

Contoh:

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 }

Bila Menggunakan WeakMap

  • Apabila anda perlu mengaitkan metadata atau data peribadi dengan objek tanpa menghalang pengumpulan sampah.
  • Sesuai untuk kes di mana jangka hayat kunci harus menentukan hayat nilai yang berkaitan.

Contoh:

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

Ringkasan

Ciri
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.
Peta WeakMap Fleksibiliti Tujuan umum, fleksibel. Kes penggunaan yang khusus dan terhad. Prestasi Rujukan utama yang berterusan. Cekap ingatan dengan rujukan yang lemah. Kesesuaian Lelaran dan storan jangka panjang. Data peribadi dan perhubungan sementara.

Atas ialah kandungan terperinci Apakah WeakMaps dalam JS?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn