📜  JavaScript 中的 Map 和 WeakMap 有什么区别?(1)

📅  最后修改于: 2023-12-03 14:42:30.104000             🧑  作者: Mango

JavaScript 中的 Map 和 WeakMap 有什么区别?

在 JavaScript 中,Map 和 WeakMap 都是用来存储键值对的集合,但是它们有很大的区别。下面我们来详细介绍一下它们的区别。

Map

Map 是一个简单的键值对集合,其中键可以是任意类型,而值也可以是任意类型。下面是 Map 的基本使用方法:

const map = new Map();

// 添加键值对
map.set('name', 'John');
map.set('age', 30);

// 获取值
console.log(map.get('name')); // 输出 "John"
console.log(map.get('age')); // 输出 30

// 判断是否存在某个键
console.log(map.has('name')); // 输出 true

// 删除某个键值对
map.delete('name');
console.log(map.has('name')); // 输出 false

// 获取键值对数量
console.log(map.size); // 输出 1
WeakMap

WeakMap 和 Map 类似,也是一个键值对集合,但是它有如下特点:

  • 键必须是对象类型,值可以是任意类型;
  • WeakMap 中的键是弱引用,即当键不再被引用时会被自动垃圾回收,因此 WeakMap 不会导致内存泄漏;
  • WeakMap 没有 size 属性,也没有 clear() 方法。

下面是 WeakMap 的基本使用方法:

const wm = new WeakMap();

// 添加键值对
const obj = {};
wm.set(obj, 'value');

// 获取值
console.log(wm.get(obj)); // 输出 "value"

// 判断是否存在某个键
console.log(wm.has(obj)); // 输出 true

// 删除某个键值对(键被自动垃圾回收)
wm.delete(obj);
console.log(wm.has(obj)); // 输出 false
总结

Map 和 WeakMap 都是用来存储键值对的集合,但是它们的本质区别在于:

  • 键类型:Map 的键可以为任意类型,而 WeakMap 的键必须为对象类型。
  • 键引用:Map 的键是强引用,不会被自动垃圾回收,而 WeakMap 的键是弱引用,会被自动垃圾回收。
  • 功能:Map 可以获取键值对数量,也可以清空所有键值对;而 WeakMap 没有这些功能。

因此,如果你需要存储任意类型的键值对,而且不需要自动垃圾回收的功能,可以使用 Map;如果你需要存储对象类型的键值对,而且希望键在不被引用时自动被垃圾回收,可以使用 WeakMap。