返回

TypeScript 从实践到精通(二)

前端

TypeScript 中的 Map、WeakMap、Set 和 WeakSet:深入探索

Map 对象

想象一下一个储物柜,里面整齐地存放着信封,每个信封上都贴着标签,代表一个特定的物品。TypeScript 中的 Map 对象类似于这个储物柜。它存储着键值对,就像标签和信封里的物品。Map 对象记住键的插入顺序,因此你可以按需检索值。它允许你使用任何值作为键或值,包括对象或原始数据类型。

Map 对象提供了方便的方法来管理键值对:

  • set(key, value):在储物柜中添加一个新的信封(键值对)。
  • get(key):找到特定信封(键)并取出它的内容(值)。
  • has(key):检查储物柜中是否有指定的信封(键)。
  • delete(key):从储物柜中取出并丢弃一封信(键值对)。
  • clear():清空储物柜,丢弃所有信封(键值对)。
  • size:获取储物柜中信封(键值对)的数量。

Map 对象还提供了遍历方法,让你可以轻松地浏览其内容:

  • forEach(callbackfn):对储物柜中的每一封信(键值对)执行指定的动作。
  • keys():返回储物柜中所有信封(键)的标签。
  • values():返回储物柜中所有信封(键值对)的内容(值)。
  • entries():返回储物柜中所有信封(键值对)的完整地址(键和值)。

WeakMap 对象

WeakMap 对象就像一个特别的储物柜,它只接受对象作为信封(键)。与 Map 对象不同,WeakMap 对象不会阻止其键被垃圾回收。这意味着当对象不再被引用时,WeakMap 对象会自动删除对应的信封(键值对)。

WeakMap 对象提供了一组类似于 Map 对象的方法,用于管理键值对,但它没有 size 属性。它也提供了遍历方法,让你可以探索其内容。

Set 对象

想象一下一个篮子,里面装满了五颜六色的球,每个球代表一个独特的元素。TypeScript 中的 Set 对象类似于这个篮子。它存储唯一的值,并记住其插入顺序。Set 对象不允许重复,这意味着每个元素只能出现一次。

Set 对象提供了几个方法来管理其内容:

  • add(value):向篮子中添加一个新的球(值)。
  • has(value):检查篮子中是否存在指定的球(值)。
  • delete(value):从篮子中取出并丢弃一个球(值)。
  • clear():清空篮子,丢弃所有球(值)。
  • size:获取篮子中球(值)的数量。

Set 对象还提供了遍历方法,让你可以轻松地浏览其内容:

  • forEach(callbackfn):对篮子中的每一个球(值)执行指定的动作。
  • values():返回篮子中所有球(值)的颜色。
  • entries():返回篮子中所有球(值)的完整信息(值)。

WeakSet 对象

WeakSet 对象就像一个特殊的篮子,它只接受对象作为球(值)。与 Set 对象类似,WeakSet 对象不会阻止其值被垃圾回收。这意味着当对象不再被引用时,WeakSet 对象会自动删除对应的球(值)。

WeakSet 对象提供了一组与 Set 对象类似的方法,用于管理其内容,但它没有 size 属性。它没有提供遍历方法。

示例:Map 对象

// 创建一个 Map 对象
const map = new Map();

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

// 获取值
console.log(map.get("name")); // John

// 检查是否存在键
console.log(map.has("age")); // true

// 删除键值对
map.delete("age");

// 遍历 Map 对象
map.forEach((value, key) => {
  console.log(key, value);
});

输出:

John
true
name John

常见问题解答

1. Map 对象和 WeakMap 对象有什么区别?

Map 对象允许任何值作为键或值,而 WeakMap 对象只允许对象作为键。WeakMap 对象也不会阻止其键被垃圾回收。

2. Set 对象和 WeakSet 对象有什么区别?

Set 对象存储唯一的值,而 WeakSet 对象存储对象值。WeakSet 对象也不会阻止其值被垃圾回收。

3. 如何遍历 WeakSet 对象?

WeakSet 对象没有提供直接的遍历方法。但是,你可以使用 WeakMap 对象作为替代,在 WeakSet 对象的值上创建 WeakMap 对象。

4. 为什么使用 WeakMap 对象或 WeakSet 对象?

WeakMap 和 WeakSet 对象对于存储临时数据或防止循环引用非常有用。它们允许你创建不会阻止垃圾回收的对象引用。

5. Map 和 WeakMap 对象在性能上有差异吗?

Map 对象通常比 WeakMap 对象性能更好,因为 WeakMap 对象需要进行额外的垃圾回收检查。