WeakMap
[TOC]
索引
构造方法:
- new WeakMap():
(iterable?)
,用于创建一个 WeakMap 对象的构造函数。暂时没有字面量创建方式。
方法:
- weakMap.set():
(key, value)
,修改原集合,用于添加或更新键值对,主要围绕弱引用机制设计。 - weakMap.get():
(key)
,用于根据键对象获取关联的值,其行为受 弱引用机制 约束。 - weakMap.has():
(key)
,用于检查指定的键对象是否存在于 WeakMap 中,其行为受 弱引用机制 约束。 - weakMap.delete():
(key)
,修改原集合,用于从集合中移除指定的键值对。
WeakMap
构造方法
new WeakMap()@
new WeakMap():(iterable?)
,用于创建一个 WeakMap 对象的构造函数。暂时没有字面量创建方式。
iterable?:
Iterator
,包含键值对数组的迭代器(如数组、Map)。返回:
weakMap:
WeakMap
,返回一个 WeakMap 对象实例;如果没传参数返回一个空 WeakMap。
核心特性:
可迭代对象的详细要求:
- 必须提供 二元数组(长度为 2 的数组) 的集合
- 每个子数组格式:
[key, value]
js// 有效初始化 const key1 = {}; const key2 = []; new WeakMap([[key1, 'A'], [key2, 'B']]); // 无效初始化 new WeakMap([['key', 'value']]); // TypeError: 键不是对象 new WeakMap([[key1]]); // TypeError: 数组长度不为2
键必须是对象:
WeakMap 的键只能是对象(包括数组、函数等引用类型),不能使用原始值(字符串、数字等)作为键:
值可以是任意类型:
弱引用机制:
- 键是弱引用:WeakMap 对键的引用是"弱"的
- 不影响垃圾回收:当键对象没有其他引用时,会被垃圾回收器回收
- 自动移除条目:键被回收后,对应的键值对会自动从 WeakMap 中移除
不可枚举性:
WeakMap 没有遍历能力:
- 没有
keys()
、values()
、entries()
方法 - 没有
forEach()
方法 - 没有
size
属性
- 没有
示例:
基础创建:
js// 空 WeakMap const emptyWM = new WeakMap(); // 从数组初始化 const key1 = { name: 'key1' }; const key2 = [1, 2, 3]; const weakMap = new WeakMap([ [key1, '值1'], [key2, { data: '值2' }] ]); // 从Map初始化 const sourceMap = new Map([ [document.body, '页面主体'], [new Date(), '创建时间'] ]); const domWM = new WeakMap(sourceMap);
方法
set()@
weakMap.set():(key, value)
,修改原集合,用于添加或更新键值对,主要围绕弱引用机制设计。
key:
object
,必须是对象(非原始值)。value:
any
,可以是任何 JS 值。返回:
weakMap:
WeakMap|TypeError
,成功时返回 WeakMap 本身;失败时抛出 TypeError 错误。
核心特性:
支持链式调用:
jsconst weakMap = new WeakMap(); const obj = {}; // 链式调用示例 weakMap.set(obj, '初始值') .set(window, '全局对象') // ✅ 链式调用 .set(document.body, '页面主体');
示例:
基本使用:
jsconst sessionData = new WeakMap(); sessionData.set(userObject, { lastLogin: new Date() });
get()@
weakMap.get():(key)
,用于根据键对象获取关联的值,其行为受 弱引用机制 约束。
key:
object
,必须是对象(非原始值),且与 set() 使用的键引用相同。返回:
value:
any|undefined|TypeError
,获取成功返回 set() 时设置的值;失败返回undefined
或TypeError
。
核心特性:
- 键的特殊要求:
- 必须为对象
- 引用严格匹配
示例:
基本使用:
jsconst weakMap = new WeakMap(); const obj = {}; const func = () => {}; // 有效获取 weakMap.set(obj, '对象值'); console.log(weakMap.get(obj)); // '对象值' // 未设置的键 console.log(weakMap.get(func)); // undefined
垃圾回收影响:
js// 垃圾回收影响 let temp = {}; weakMap.set(temp, '临时数据'); temp = null; // 移除强引用 // 垃圾回收后(时间不确定) setTimeout(() => { console.log(weakMap.get(temp)); // undefined }, 10000);
has()
weakMap.has():(key)
,用于检查指定的键对象是否存在于 WeakMap 中,其行为受 弱引用机制 约束。
key:
object
,必须是对象(非原始值),用于检查是否存在于 WeakMap 中。返回:
has:
boolean
,返回键对象是否存在于 WeakMap 中。
核心特性:
键的特殊要求:
- 必须为对象
- 引用严格匹配
只检查键是否存在:与值没有关系。
jsconst objKey = {}; weakMap.set(objKey, '值存在'); // 即使值为undefined/null console.log(weakMap.has(objKey)); // true // 删除值(但键仍存在) weakMap.set(objKey, undefined); console.log(weakMap.has(objKey)); // true(键仍存在) // 删除键 weakMap.delete(objKey); console.log(weakMap.has(objKey)); // false
示例:
基本使用:
jsconst weakMap = new WeakMap(); const obj = {}; const func = () => {}; // 存在检查 weakMap.set(obj, '对象值'); console.log(weakMap.has(obj)); // true // 未设置的键 console.log(weakMap.has(func)); // false
垃圾回收影响:
js// 垃圾回收影响 let temp = {}; weakMap.set(temp, '临时数据'); console.log(weakMap.has(temp)); // true(强引用存在) temp = null; // 移除强引用 // 垃圾回收后(时间不确定) setTimeout(() => { console.log(weakMap.has({})); // false(原键已被回收) }, 10000);
delete()
weakMap.delete():(key)
,修改原集合,用于从集合中移除指定的键值对。
key:
object
,必须是对象(非原始值),用于定位要删除的键值对。返回:
isDeleted:
boolean
,返回是否成功删除指定键值对。
核心特性:
- 键的特殊要求:
- 必须为对象
- 引用严格匹配
示例:
基本使用:
jsconst weakMap = new WeakMap(); const obj = {}; const func = () => {}; // 成功删除 weakMap.set(obj, '对象值'); console.log(weakMap.delete(obj)); // true console.log(weakMap.has(obj)); // false // 删除不存在的键 console.log(weakMap.delete(func)); // false