当前位置:首页 > JavaScript

js实现weakmap

2026-01-31 15:20:07JavaScript

WeakMap 的基本概念

WeakMap 是 JavaScript 中的一种集合类型,允许将对象作为键名。与普通的 Map 不同,WeakMap 的键名必须是对象,且键名是弱引用,不会阻止垃圾回收机制对键名对象的回收。当键名对象被回收后,对应的键值对会自动从 WeakMap 中移除。

创建 WeakMap

使用 new WeakMap() 构造函数可以创建一个空的 WeakMap。WeakMap 的键必须是对象,值可以是任意类型。

const weakMap = new WeakMap();
const keyObj = {};
weakMap.set(keyObj, 'value associated with keyObj');

WeakMap 的常用方法

WeakMap 提供了三个主要方法:setgethas,以及一个 delete 方法。与 Map 不同,WeakMap 不支持迭代或直接访问所有键值对。

const weakMap = new WeakMap();
const keyObj = {};

// 设置键值对
weakMap.set(keyObj, 'some value');

// 获取值
console.log(weakMap.get(keyObj)); // 输出: 'some value'

// 检查键是否存在
console.log(weakMap.has(keyObj)); // 输出: true

// 删除键值对
weakMap.delete(keyObj);
console.log(weakMap.has(keyObj)); // 输出: false

WeakMap 的特性

WeakMap 的键名是弱引用,不会阻止垃圾回收。当键名对象没有其他引用时,垃圾回收器会自动回收该对象,并从 WeakMap 中移除对应的键值对。

let keyObj = {};
const weakMap = new WeakMap();
weakMap.set(keyObj, 'value');

// 移除对 keyObj 的引用
keyObj = null;

// 垃圾回收后,weakMap 中的键值对会自动移除

WeakMap 的应用场景

WeakMap 常用于存储与对象关联的私有数据或元数据,而不会影响对象的生命周期。例如,可以在不修改对象本身的情况下,为其附加额外的信息。

const privateData = new WeakMap();

class MyClass {
  constructor() {
    privateData.set(this, { secret: 42 });
  }

  getSecret() {
    return privateData.get(this).secret;
  }
}

const instance = new MyClass();
console.log(instance.getSecret()); // 输出: 42

WeakMap 与 Map 的区别

WeakMap 和 Map 的主要区别在于键名的引用强度。Map 的键名是强引用,会阻止垃圾回收,而 WeakMap 的键名是弱引用,不会阻止垃圾回收。此外,WeakMap 不支持迭代或直接访问所有键值对。

const map = new Map();
const weakMap = new WeakMap();
let keyObj = {};

map.set(keyObj, 'map value');
weakMap.set(keyObj, 'weakmap value');

// 移除对 keyObj 的引用
keyObj = null;

// map 仍然保留键值对,weakMap 的键值对会被回收

注意事项

WeakMap 的键名必须是对象,不能是原始值(如字符串、数字等)。尝试使用非对象作为键名会抛出错误。

const weakMap = new WeakMap();
weakMap.set('primitive', 'value'); // 抛出 TypeError

浏览器兼容性

WeakMap 是 ES6 引入的特性,现代浏览器和 Node.js 环境均支持。在不支持的环境中,可以通过 polyfill 实现类似功能。

js实现weakmap

标签: jsweakmap
分享给朋友:

相关文章

js实现

js实现

JavaScript 实现方法 JavaScript 是一种广泛使用的编程语言,适用于网页开发、服务器端编程以及移动应用开发。以下是几种常见的 JavaScript 实现方法: 网页交互功能 使用…

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url,…