Map和WeakMap是JavaScript中两种不同的映射数据结构。它们都允许您将键映射到值,但它们的使用场景和用法略有不同。

 Map

Map是一个通用的映射数据结构,它允许您将任何类型的键映射到任何类型的值。以下是一些常见的用例:

- 缓存数据:您可以使用Map来缓存数据,以避免重复计算或网络请求。
- 计数器:您可以使用Map来计算某些元素的出现次数。
- 事件处理程序:您可以使用Map来存储事件处理程序,以便稍后可以轻松地添加或删除它们。

以下是一些常见的Map方法:

- set(key, value):将键映射到值。
- get(key):获取键对应的值。
- has(key):检查是否存在具有给定键的条目。
- delete(key):删除具有给定键的条目。
- clear():删除所有条目。
- size属性:返回Map中条目的数量。

以下是一个使用Map的示例:

const cache = new Map();
function fetchData(url) {
  if (cache.has(url)) {
    return Promise.resolve(cache.get(url));
  }
  return fetch(url)
    .then(response => response.json())
    .then(data => {
      cache.set(url, data);
      return data;
    });
}

在这个例子中,我们使用Map来缓存数据。如果我们已经缓存了给定的URL的数据,我们会立即返回缓存的数据。否则,我们将发出网络请求来获取数据,并将其添加到缓存中。

  WeakMap

WeakMap是一种特殊类型的映射,它只允许您将对象作为键映射到值。以下是一些常见的用例:
- 私有数据:您可以使用WeakMap来存储对象的私有数据,这些数据不会被其他代码访问。
- 缓存数据:您可以使用WeakMap来缓存数据,以避免重复计算或网络请求。与Map不同,WeakMap中的条目可能会被垃圾回收器自动删除,因此它们不会占用太多内存。
以下是一些常见的WeakMap方法:
- set(key, value):将键映射到值。
- get(key):获取键对应的值。
- has(key):检查是否存在具有给定键的条目。
- delete(key):删除具有给定键的条目。
以下是一个使用WeakMap的示例:

const privateData = new WeakMap();

class Person {

  constructor(name) {

    privateData.set(this, { name });

  }

  getName() {

    return privateData.get(this).name;

  }

}

const person = new Person('Alice');

console.log(person.getName()); // "Alice"

console.log(privateData.get(person)); // undefined

在这个例子中,我们使用WeakMap来存储Person对象的私有数据。我们将Person对象作为键,将包含私有数据的对象作为值。由于WeakMap中的条目可能会被垃圾回收器自动删除,因此我们不必担心内存泄漏问题。