【JavaScript源代码】JavaScript WeakMap使用详解.docx
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
JavaScript WeakMap使用详解 WeakMap 对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。 语法 new WeakMap([iterable]) 参数 iterable Iterable 是一个数组(二元数组)或者其他可迭代的且其元素是键值对的对象。每个键值对会被加到新的 WeakMap 里。null 会被当做 undefined。 描述 WeakMap 的 key 只能是 Object 类型。 原始数据类型 是不能作为 key 的(比如 Symbol)。 Why WeakMap? 在 JavaScript 里,ma ### JavaScript WeakMap 使用详解 #### 一、WeakMap 概述 `WeakMap` 是 JavaScript 中的一个内置对象,它提供了一种存储键值对的方法,其中键必须是对象,值可以是任意类型的数据。与 `Map` 类似,`WeakMap` 也可以用来存储对象的属性,但它具有以下特性: - 键是弱引用:这意味着如果一个对象作为键存在于 `WeakMap` 中,并且没有其他强引用指向这个对象,则该对象可能会被垃圾回收。 - 键不可枚举:无法通过 `keys()`、`values()` 或 `entries()` 方法获取 `WeakMap` 的键。 #### 二、WeakMap 的语法 创建一个新的 `WeakMap` 对象的基本语法如下: ```javascript var weakMap = new WeakMap([iterable]); ``` - **参数**: - `iterable`: (可选) 一个可迭代的对象,例如数组。每个元素应该是一个包含两个元素的数组,即 [key, value] 形式的键值对。如果提供此参数,那么这些键值对将被添加到新创建的 `WeakMap` 中。 #### 三、WeakMap 的使用场景 使用 `WeakMap` 而不是 `Map` 的主要原因是避免内存泄漏问题。在 JavaScript 中,通常情况下,当一个对象不再被任何变量引用时,它会被垃圾回收机制自动清理。但是,如果这个对象被作为某个 `Map` 的键,则即使没有其他引用,该对象也不会被垃圾回收,因为它仍然被 `Map` 引用着。这可能导致内存泄漏。`WeakMap` 解决了这个问题,因为它是弱引用键,所以当键对象不再有强引用时,它可以从 `WeakMap` 中自动释放,不会导致内存泄漏。 #### 四、WeakMap 的内部结构 `WeakMap` 的内部结构是为了提高性能和减少内存占用而特别设计的。它使用了一种特殊的结构,使得在存储和检索数据时,不需要遍历整个数据集。这意味着添加和查找操作的时间复杂度远低于普通的 `Map` 结构。 #### 五、WeakMap 的属性 - **length**: 这个属性始终为 0,因为 `WeakMap` 的键是动态的,并且可能因垃圾回收而变化,所以无法确定其大小。 - **prototype**: `WeakMap` 构造函数的原型,允许向所有 `WeakMap` 对象添加属性。 #### 六、WeakMap 的方法 - **WeakMap.prototype.constructor**: 返回创建 `WeakMap` 实例的构造函数。 - **WeakMap.prototype.delete(key)**: 移除与 `key` 关联的对象。 - **WeakMap.prototype.get(key)**: 返回与 `key` 关联的对象,如果没有找到则返回 `undefined`。 - **WeakMap.prototype.has(key)**: 如果 `key` 在 `WeakMap` 中存在,则返回 `true`,否则返回 `false`。 - **WeakMap.prototype.set(key, value)**: 设置与 `key` 关联的对象为 `value`,并返回当前 `WeakMap` 对象。 #### 七、示例代码 下面是一个简单的示例,展示了如何创建和使用 `WeakMap`: ```javascript // 创建 WeakMap const wm1 = new WeakMap(), wm2 = new WeakMap(), wm3 = new WeakMap(); const o1 = {}, o2 = function(){}, o3 = window; // 添加键值对 wm1.set(o1, 37); wm1.set(o2, "azerty"); wm2.set(o1, o2); wm2.set(o3, undefined); wm2.set(wm1, wm2); // 访问数据 console.log(wm1.get(o2)); // 输出 "azerty" console.log(wm2.get(o2)); // 输出 undefined,因为 wm2 中没有 o2 这个键 // 检查是否存在 console.log(wm1.has(o2)); // 输出 true console.log(wm2.has(o2)); // 输出 false console.log(wm2.has(o3)); // 输出 true // 删除键值对 wm1.delete(o1); console.log(wm1.has(o1)); // 输出 false ``` #### 八、WeakMap 的高级用法 除了基本的使用外,`WeakMap` 还可以在某些特定场景下发挥更大的作用,例如用于缓存计算结果、私有化数据等。 #### 九、自定义 WeakMap 类 有时可能需要扩展 `WeakMap` 的功能,例如添加 `clear` 方法来清空整个 `WeakMap`: ```javascript class ClearableWeakMap { constructor(init) { this._wm = new WeakMap(init); } clear() { this._wm = new WeakMap(); } delete(k) { return this._wm.delete(k); } get(k) { return this._wm.get(k); } has(k) { return this._wm.has(k); } set(k, v) { this._wm.set(k, v); return this; } } ``` #### 十、WeakMap 规范 `WeakMap` 符合 ECMAScript 标准,具体版本为 ECMAScript 6 (ES6)。这意味着所有支持 ES6 的现代浏览器都支持 `WeakMap` 的使用。 总结来说,`WeakMap` 是一种非常有用的数据结构,它可以用来存储临时性的数据,特别是在需要避免内存泄漏的情况下。通过使用弱引用作为键,`WeakMap` 可以有效地管理内存资源,同时保持高性能。






























- 粉丝: 1w+
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 大数据时代的社交网络.pptx
- 基于小型网站的网络安全策略.doc
- 互联网时代下产品设计方案的构建.doc
- word与excel邮件合并.ppt
- 基于互联网+背景下的高职会计专业人才培养思路探索.docx
- matlab插值与拟合(命令与示例).doc
- 浅析信息化在医院品牌建设中所起的作用.doc
- 纵向项目管理流程图.docx
- 基于51单片机的智能交通灯系统方案设计书84826.doc
- 实施自动化灌溉技术存在的问题与对策探讨.doc
- 互联网金融行业配对交易策略设计.docx
- 使用 numpy 实现的简易神经网络框架
- HPXCloud云计算解决方案.pptx
- 中国大数据金融风险防控指数分析报告.docx
- 浪漫表白代码-html 生日快乐代码
- 嵌入式系统第三讲-Android系统架构与开发.ppt


