0Pricing
JavaScript Academy · 课时

WeakMap 与 WeakSet——简单的隐私保护与缓存

学习 WeakMap/WeakSet 基础:仅限对象的键、没有大小和迭代功能、隐私辅助工具,以及会自动清理的小型缓存

WeakMap 与 WeakSet——简单的隐私保护与缓存 是 CoddyKit 上的免费 JavaScript Academy 课时。 这是第 2 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 JavaScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 JavaScript Academy 课程共包含 3 节课。

为什么使用弱集合

目标:为对象添加元数据,同时不阻止垃圾回收。

  • WeakMap:对象 → 值
  • WeakSet:对象成员资格
  • 没有大小,也不能迭代
  • 非常适合隐私数据和缓存
WeakMap 与 WeakSet——简单的隐私保护与缓存 — 插图 1

WeakMap 要点

WeakMap只接受对象键;支持 set/get/has/delete;不能迭代,也没有大小。

// WeakMap: keys must be objects
const wm = new WeakMap();

const user = { name: "Ayla" };
wm.set(user, { visits: 1 });

console.log("has user?", wm.has(user));
console.log("get meta:", wm.get(user));

// Note: no wm.size, no wm.keys() — not iterable
WeakMap 与 WeakSet——简单的隐私保护与缓存 — 插图 2

WeakSet 要点

WeakSet保存对象;没有重复项,不能迭代,也没有大小属性。

// WeakSet: store objects without duplicates
const ws = new WeakSet();

const obj1 = {};
const obj2 = {};

ws.add(obj1);
ws.add(obj2);
ws.add(obj1); // duplicate ignored

console.log("has obj1?", ws.has(obj1));

// Note: no ws.size and no iteration
WeakMap 与 WeakSet——简单的隐私保护与缓存 — 插图 3

通过 WeakMap 实现隐私

使用WeakMap为接口对象附加隐藏数据;当接口对象消失后,这些数据也可以被回收。

// Privacy helper: store private data outside the object
const _priv = new WeakMap();

function makeCounter() {
  const api = {};
  _priv.set(api, { value: 0 });

  api.inc = function () {
    const box = _priv.get(api);
    box.value = box.value + 1;
    console.log("value", box.value);
  };

  // No public field exposes value directly
  return api;
}

const c = makeCounter();
c.inc();
c.inc();
// console.log(c.value) -> undefined (nothing public)
WeakMap 与 WeakSet——简单的隐私保护与缓存 — 插图 4

每个对象的缓存

创建一个每对象缓存;当键对象不再被引用时,其中的条目就会消失。

// Cache computed data per object without leaks
const cache = new WeakMap();

function computeLength(doc) {
  // Return cached result if present
  if (cache.has(doc)) {
    return cache.get(doc);
  }
  // Fake "expensive" compute
  const result = (doc.text || "").length;
  cache.set(doc, result);
  return result;
}

const d1 = { text: "hello" };
const d2 = { text: "world!" };

console.log("len d1:", computeLength(d1));
console.log("len d1 cached:", computeLength(d1));
console.log("len d2:", computeLength(d2));

// If d1/d2 become unreachable, their cache entries can disappear automatically
WeakMap 与 WeakSet——简单的隐私保护与缓存 — 插图 5

限制与不适用场景

请记住:

  • WeakMap/WeakSet 不能迭代,也没有大小。
  • 键必须是对象。
  • 如果需要列出键或统计条目数量,请使用映射/集合。
WeakMap 与 WeakSet——简单的隐私保护与缓存 — 插图 6

WeakMap 与映射测验

快速检查:WeakMap 的使用场景。

WeakMap 与 WeakSet——简单的隐私保护与缓存 — 插图 7

回顾

回顾:使用WeakMap实现对象→值的数据隐私保护和缓存;使用WeakSet记录对象成员资格而不造成泄漏。请记住:只能使用对象键,不能迭代,也没有大小。

WeakMap 与 WeakSet——简单的隐私保护与缓存 — 插图 8

常见问题解答

「WeakMap 与 WeakSet——简单的隐私保护与缓存」课时是免费的吗?

是的 — 「WeakMap 与 WeakSet——简单的隐私保护与缓存」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 JavaScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 JavaScript Academy 课程共包含 3 节课。

「WeakMap 与 WeakSet——简单的隐私保护与缓存」这节课中我会学到什么?

学习 WeakMap/WeakSet 基础:仅限对象的键、没有大小和迭代功能、隐私辅助工具,以及会自动清理的小型缓存 你通过在浏览器中直接运行的动手代码来练习 JavaScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 JavaScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 JavaScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 3 节。

「WeakMap 与 WeakSet——简单的隐私保护与缓存」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 JavaScript Academy 课中编写并运行代码吗?

能。每节 JavaScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Map 与 Set 基础
  2. WeakMap 与 WeakSet——简单的隐私保护与缓存
  3. 迭代模式
← 返回 JavaScript Academy