当前位置:首页 > 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 的键名必须是对象,不能是原始值(如字符串、数字等)。尝试使用非对象作为键名会抛出错误。

js实现weakmap

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

浏览器兼容性

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

标签: jsweakmap
分享给朋友:

相关文章

js实现验证码

js实现验证码

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

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…