在 ECMAScript 中,WeakMap 和 WeakSet 是两种特殊类型的集合,它们允许你存储对象作为键(对于 WeakMap)或元素(对于 WeakSet),同时不会阻止这些对象被垃圾回收。这意味着如果一个对象只被用作 WeakMap 的键或 WeakSet 的元素,那么它可以在任何时候被垃圾回收,即使它仍然存在于 WeakMap 或 WeakSet 中。
WeakMap 是一种键值对的集合,其中键必须是对象,而值可以是任意类型。WeakMap 的键是弱引用的,这意味着如果没有其他地方引用键对象,那么该对象可以被垃圾回收,同时对应的键值对也会从 WeakMap 中自动删除。
创建一个 WeakMap:
const weakMap = new WeakMap();
使用 WeakMap:
const keyObject = {};
const value = 'some value';
// 设置键值对
weakMap.set(keyObject, value);
// 获取值
console.log(weakMap.get(keyObject)); // 输出: some value
// 检查是否包含某个键
console.log(weakMap.has(keyObject)); // 输出: true
// 删除键值对
weakMap.delete(keyObject);
// 检查是否还包含该键
console.log(weakMap.has(keyObject)); // 输出: false
WeakSet 是一种值的集合,其中的值必须是对象。与 WeakMap 类似,WeakSet 中的对象也是弱引用的,如果对象没有其他引用,它会被垃圾回收,并且自动从 WeakSet 中删除。
创建一个 WeakSet:
const weakSet = new WeakSet();
使用 WeakSet:
const object1 = {};
const object2 = {};
// 添加对象到 WeakSet
weakSet.add(object1);
// 检查是否包含某个对象
console.log(weakSet.has(object1)); // 输出: true
console.log(weakSet.has(object2)); // 输出: false
// WeakSet 不提供遍历方法,因此不能获取 WeakSet 中的所有元素
// 也不能删除 WeakSet 中的单个元素,除非使用迭代器
WeakMap 和 WeakSet 的主要用途是在不阻止垃圾回收的情况下跟踪对象。例如,你可以使用它们来存储与 DOM 元素相关的私有数据,或者缓存计算结果,而不会阻止这些元素或计算结果在没有其他引用时被回收。
由于 WeakMap 和 WeakSet 不能被遍历,它们不适合用于需要枚举所有键或值的场景。此外,由于它们的键或值是弱引用的,所以不能保证它们的生命周期,这意味着你不能依赖它们来持久化数据。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。