首页 >web前端 >js教程 >JS 中的 WeakMap 是什么?

JS 中的 WeakMap 是什么?

Susan Sarandon
Susan Sarandon原创
2024-12-27 08:45:10241浏览

JavaScript 中的

What are WeakMaps in JS?

WeakMap 是一个键值对的集合,其中键必须是 objects,以及对这些对象的引用键很“弱”。这意味着如果没有其他对关键对象的引用,即使它仍在 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.
地图 WeakMap 标题> 键类型 键可以是任何类型:对象、基元。 键必须是对象。 垃圾收集 不依赖垃圾收集;密钥仍然存在。 密钥的保存较弱,可以被垃圾收集。 迭代 可迭代(可以使用 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.迭代

  • Map:可迭代。您可以使用 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:没有 size 属性,因为它不可迭代并且条目是弱引用的。
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 }

何时使用 Wea​​kMap

  • 当您需要将元数据或私有数据与对象关联而不阻止垃圾收集时。
  • 非常适合键的生命周期应决定关联值的生命周期的情况。

示例:

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.
地图 WeakMap 标题> 灵活性 通用、灵活。 专门的、有限的用例。 性能 持久关键引用。 弱引用提高内存效率。 适用性 迭代和长期存储。 私有数据和短暂关系。 表>

以上是JS 中的 WeakMap 是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn