在 JavaScript 中,WeakMap 与 Map 有哪些不同之处?请说明它们在键的引用、可枚举性、内存管理以及适用场景上的差异。
考察说明
考察对 JavaScript 中两种集合类型 Map 和 WeakMap 核心区别的理解,包括键的引用方式、遍历能力和内存管理机制。
回答思路
- 【回答框架 1】WeakMap 的键必须是对象,而 Map 的键可以是任意类型,包括原始值。WeakMap 持有键的弱引用,不影响垃圾回收,因此内存管理更友好。
- 【回答框架 2】Map 是可迭代的,支持 forEach、keys()、values() 等方法,而 WeakMap 不可迭代,也没有 size 属性,因为它们无法枚举键,目的是防止回收时机不可控。
- 【回答框架 3】适用场景上,Map 适合需要遍历键值对的场景,而 WeakMap 常用于存储与对象关联的私有数据或缓存,避免内存泄漏。
- 【回答框架 4】由于弱引用特性,WeakMap 中的键可能随时被回收,因此不能依赖其中的数据持久存在。
- 【关键点 1】WeakMap 的键必须为对象,Map 键可为原始值或对象。
- 【关键点 2】WeakMap 不可迭代,无 size 属性,Map 可迭代且可获取大小。
- 【关键点 3】WeakMap 持有弱引用,不影响垃圾回收,适合关联对象数据。
- 【易错点 1】误以为 WeakMap 可以枚举或获取大小。
- 【易错点 2】将 WeakMap 用于非对象键导致错误。