Skip to content

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)。

  • 返回:

  • weakMapWeakMap,返回一个 WeakMap 对象实例;如果没传参数返回一个空 WeakMap。

核心特性

  1. 可迭代对象的详细要求

    • 必须提供 二元数组(长度为 2 的数组) 的集合
    • 每个子数组格式:[key, value]
    js
    // 有效初始化
    const key1 = {};
    const key2 = [];
    new WeakMap([[key1, 'A'], [key2, 'B']]);
    
    // 无效初始化
    new WeakMap([['key', 'value']]); // TypeError: 键不是对象
    new WeakMap([[key1]]);           // TypeError: 数组长度不为2
  2. 键必须是对象

    WeakMap 的键只能是对象(包括数组、函数等引用类型),不能使用原始值(字符串、数字等)作为键:

  3. 值可以是任意类型

  4. 弱引用机制

    • 键是弱引用:WeakMap 对键的引用是"弱"的
    • 不影响垃圾回收:当键对象没有其他引用时,会被垃圾回收器回收
    • 自动移除条目:键被回收后,对应的键值对会自动从 WeakMap 中移除
  5. 不可枚举性

    WeakMap 没有遍历能力

    • 没有 keys()values()entries() 方法
    • 没有 forEach() 方法
    • 没有 size 属性

示例

  1. 基础创建

    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)修改原集合,用于添加或更新键值对,主要围绕弱引用机制设计。

  • keyobject,必须是对象(非原始值)。

  • valueany,可以是任何 JS 值。

  • 返回:

  • weakMapWeakMap|TypeError,成功时返回 WeakMap 本身;失败时抛出 TypeError 错误。

核心特性

  1. new WeakMap()

  2. 支持链式调用

    js
    const weakMap = new WeakMap();
    const obj = {};
    
    // 链式调用示例
    weakMap.set(obj, '初始值')
           .set(window, '全局对象') // ✅ 链式调用
           .set(document.body, '页面主体');

示例

  1. 基本使用

    js
    const sessionData = new WeakMap();
    sessionData.set(userObject, { lastLogin: new Date() });

get()@

weakMap.get()(key),用于根据键对象获取关联的值,其行为受 弱引用机制 约束。

  • keyobject,必须是对象(非原始值),且与 set() 使用的键引用相同。

  • 返回:

  • valueany|undefined|TypeError,获取成功返回 set() 时设置的值;失败返回 undefinedTypeError

核心特性

  1. 键的特殊要求
    • 必须为对象
    • 引用严格匹配

示例

  1. 基本使用

    js
    const weakMap = new WeakMap();
    const obj = {};
    const func = () => {};
    
    // 有效获取
    weakMap.set(obj, '对象值');
    console.log(weakMap.get(obj)); // '对象值'
    
    // 未设置的键
    console.log(weakMap.get(func)); // undefined
  2. 垃圾回收影响

    js
    // 垃圾回收影响
    let temp = {};
    weakMap.set(temp, '临时数据');
    temp = null; // 移除强引用
    
    // 垃圾回收后(时间不确定)
    setTimeout(() => {
      console.log(weakMap.get(temp)); // undefined
    }, 10000);

has()

weakMap.has()(key),用于检查指定的键对象是否存在于 WeakMap 中,其行为受 弱引用机制 约束。

  • keyobject,必须是对象(非原始值),用于检查是否存在于 WeakMap 中。

  • 返回:

  • hasboolean,返回键对象是否存在于 WeakMap 中。

核心特性

  1. 键的特殊要求

    • 必须为对象
    • 引用严格匹配
  2. 只检查键是否存在:与值没有关系。

    js
    const 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

示例

  1. 基本使用

    js
    const weakMap = new WeakMap();
    const obj = {};
    const func = () => {};
    
    // 存在检查
    weakMap.set(obj, '对象值');
    console.log(weakMap.has(obj)); // true
    
    // 未设置的键
    console.log(weakMap.has(func)); // false
  2. 垃圾回收影响

    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)修改原集合,用于从集合中移除指定的键值对

  • keyobject,必须是对象(非原始值),用于定位要删除的键值对。

  • 返回:

  • isDeletedboolean,返回是否成功删除指定键值对。

核心特性

  1. 键的特殊要求
    • 必须为对象
    • 引用严格匹配

示例

  1. 基本使用

    js
    const 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