javascript中的WeakMap和WeakSet

简介: javascript中的WeakMap和WeakSet

WeakMap的key不能是基本类型

let weakMap = new WeakMap();
let obj = {};
weakMap.set(obj, "ok"); // works fine (object key)
// can't use a string as the key
weakMap.set("test", "Whoops"); // Error, because "test" is not an object

如果key指向了null,则key会被自动回收

let john = { name: "John" };
let weakMap = new WeakMap();
weakMap.set(john, "...");
john = null; // overwrite the reference
// john is removed from memory!

WeekMap只有如下的方法

  • weakMap.get(key)
  • weakMap.set(key, value)
  • weakMap.delete(key)
  • weakMap.has(key)

什么时候使用这个数据结构,如果key失去了引用,那么就自动回收它,比如用户和用户的访问量,如果用户离开了,那么它的访问量也就没有存在的价值了,此时可以使用这个数据结构进行存储

let visitsCountMap = new WeakMap(); // weakmap: user => visits count
// increase the visits count
function countUser(user) {
  let count = visitsCountMap.get(user) || 0;
  visitsCountMap.set(user, count + 1);
}

另外一种用途就是缓存

let cache = new WeakMap();
// calculate and remember the result
function process(obj) {
  if (!cache.has(obj)) {
    let result = /* calculate the result for */ obj;
    cache.set(obj, result);
  }
  return cache.get(obj);
}
// 📁 main.js
let obj = {/* some object */};
let result1 = process(obj);
let result2 = process(obj);
// ...later, when the object is not needed any more:
obj = null;
// Can't get cache.size, as it's a WeakMap,
// but it's 0 or soon be 0
// When obj gets garbage collected, cached data will be removed as well

WeakSet可以用来记录哪些人访问了网站

let visitedSet = new WeakSet();
let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };
visitedSet.add(john); // John visited us
visitedSet.add(pete); // Then Pete
visitedSet.add(john); // John again
// visitedSet has 2 users now
// check if John visited?
alert(visitedSet.has(john)); // true
// check if Mary visited?
alert(visitedSet.has(mary)); // false
john = null;
// visitedSet will be cleaned automatically
相关文章
|
7月前
|
存储 JavaScript 前端开发
【JavaScript】Set、Map、WeakSet、WeakMap
Set、Map、WeakSet和WeakMap是ES6引入的新的数据结构,它们在处理数据时具有不同的特性和用途。本文将详细介绍它们的用法、特性、区别、优缺点以及使用场景和注意事项,并给出相应的代码示例
96 0
|
7月前
|
存储 JavaScript 前端开发
理解JavaScript中的WeakSet和WeakMap
理解JavaScript中的WeakSet和WeakMap
|
7月前
|
存储 缓存 JavaScript
什么是 JavaScript 中的 WeakMap
什么是 JavaScript 中的 WeakMap
55 0
|
JavaScript 前端开发 Java
带你读《现代Javascript高级教程》十二、深入理解JavaScript中的WeakMap和WeakSet(1)
带你读《现代Javascript高级教程》十二、深入理解JavaScript中的WeakMap和WeakSet(1)
|
存储 JavaScript 前端开发
带你读《现代Javascript高级教程》十二、深入理解JavaScript中的WeakMap和WeakSet(2)
带你读《现代Javascript高级教程》十二、深入理解JavaScript中的WeakMap和WeakSet(2)
|
JavaScript 前端开发 Java
带你读《现代Javascript高级教程》——深入理解JavaScript中的WeakMap和WeakSet(1)
带你读《现代Javascript高级教程》——深入理解JavaScript中的WeakMap和WeakSet
|
前端开发 JavaScript
html标签的tabindex属性?css变量和js更改变量?ES6新增特性Map/WeakMap和Set/WeakSet
tabindex 属性规定元素的 tab 键控制次序(当 tab 键用于导航时)。
|
24天前
|
JavaScript 前端开发
JavaScript中的原型 保姆级文章一文搞懂
本文详细解析了JavaScript中的原型概念,从构造函数、原型对象、`__proto__`属性、`constructor`属性到原型链,层层递进地解释了JavaScript如何通过原型实现继承机制。适合初学者深入理解JS面向对象编程的核心原理。
22 1
JavaScript中的原型 保姆级文章一文搞懂
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
101 2
|
20天前
JS+CSS3文章内容背景黑白切换源码
JS+CSS3文章内容背景黑白切换源码是一款基于JS+CSS3制作的简单网页文章文字内容背景颜色黑白切换效果。
16 0