ES6 - WeakMap

模式流星
• 阅读 985

Set有对应的WeakSet, Map也有WeakMap。这一篇,我们就来学习一下WeakMap有写什么特性。
先来看一下WeakMap的基本特性

1: WeakMap是一种存储多个键值对的无序列表
2: WeakMap的键必须是非null的对象类型
3: WeakMap的键对应的值,可以是任意类型

接下来看一下WeakMap的接口方法:
一:WeakMap的新建与初始化
与Map相同的,WeakMap也可以通过new WeakMap()新建和初始化:

let weakMap1 = new WeakMap();
let key1 = {};
let key2 = {};
let weakMap2 = new WeakMap([[key1, 'key1'],[key2, 'key2']]);

只是与Map不同,WeakMap的key必须是对象,不能是原始类型。

二:WeakMap的增删查减
WeakMap的接口函数与Map基本一致,只是没有clear()方法:

1: set(key, value) 添加一个键值对
2: get(key) 获取key对应的value
3: has(key) 判断key是否存在于WeakMap
4: delete(key) 移除key对应的键值对

下面我们看一个用了以上所有方法的示例:

let weakMap = new WeakMap();
let key1 = {'id': 1};
let key2 = {'id': 2};

weakMap.set(key1, {'name': 'mike'});
weakMap.set(key2, {'name': 'lily'});
console.log(weakMap.get(key1)); //{name: "mike"}
console.log(weakMap.has(key1)); //true
weakMap.delete(key1);
console.log(weakMap);

最后一行代码的打印结果为:

WeakMap {{…} => {…}}
__proto__: WeakMap
[[Entries]]: Array(1)
0: {Object => Object}
key: {id: 2}
value: {name: "lily"}
length: 1

三:WeakMap的限制

1: WeakMap没有size属性
2: WeakMap在初始化或者调用set()的时候,key必须为非null对象,不然会抛出错误
3: WeakMap是不可枚举的,所以没有clear(), forEach()方法,不能在for...of环境下使用

四:WeakMap的使用场景
我们前面说到WeakMap的key必须要是非null的对象,WeakMap存储的key也是对象的弱引用,如果在此之外不存在其他强引用,JavaScript的引擎的垃圾回收机制会自动回收这个对象。而key对应的value如果是对象的话,那依然存储的对象的强引用。

所以当你遇到一个需要用到存储键值对的场景,在Map和WeakMap之间你需要权衡的点有:

1:你是否需要用对象做key,如果是,那么WeakMap是比Map更好的选择
2: 如果你选择的WeakMap,你功能的实现是否不受限与WeakMap本身的限制(也就是我们前面说到的‘三:WeakMap的限制’)。

以上就是WeakMap的基本特殊和使用方法以及场景。

点赞
收藏
评论区
推荐文章
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
3年前
Vue 3 深入响应性原理
深入响应性原理终于到了讲解我们Vue的响应式原理,前面我们已经讲解了Map,WeakMap,Set,WeakSet,Proxy,Reflect这几个知识点。那么接下来思考下到底什么是响应式,就比如我们做一个公司的官网,然后要求必须兼容手机端,ipad端,电脑端,内容屏幕大小变化而变化,这些就需要依赖Ja
Easter79 Easter79
3年前
Vue 3 高阶指南之 WeakMap
高阶指南之WeakMap「WeakMap」对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。在JavaScript里,mapAPI可以通过使其四个API方法共用两个数组(一个存放键,一个存放值)来实现。给这种map设置值时会同时将键和值添加到这两个数组的末尾。从
zdd小小菜鸟 zdd小小菜鸟
2年前
Java基础面试
Java基础面试1.Java集合类的总结tex1、Iterator:Collection(值)、Map(键值对);2、Collection:Set(无序不重复)、List(有序可重复)、Queue;3、Set:H
小万哥 小万哥
1年前
Python 集合(Sets)1
集合集合用于在单个变量中存储多个项。集合是Python中的4种内置数据类型之一,用于存储数据集合,其他3种是列表(List)、元组(Tuple)和字典(Dictionary),它们都具有不同的特性和用途。集合是一种无序、不可更改()、无索引的集合。创建一个
陈占占 陈占占
3年前
python 字典
字典(dict):以键值对的方式存在,以大括号为标志、在字典里面键是不能修改的,值可以修改语法格式:字典名{key1:value1,key2:value2,.......}note:是无序的类型,建必须唯一,值不必。索引是以键为下标,不能索引键对应的值,键不能为列表特点:1.键值之间必须用冒号(:)隔开2.项与项之间必须用逗号(,)隔开3.字典中的键必须
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
HashMap1.7和1.8,红黑树原理!
jdk1.7概述HashMap基于Map接口实现,元素以键值对的方式存储,并允许使用null键和null值,但只能有一个键作为null,因为key不允许重复,另外HashMap不能保证放入元素的数据,它是无序的,和放入的顺序并不能相同,HashMap是线程不安全的。继承关系publicclassH
Wesley13 Wesley13
3年前
Java集合之Map接口
Map使用键值对来存储数据,将键映射到值对象,一个映射不能包含重复的键,每一个键最多只能映射到一个值。Map接口的具体实现类:HashMap,Hashtable,TreeMap,LinkedHashMap  1)HashMap  基于哈希表(哈希表学习地址)的Map接口实现。允许使用null值和null键,不保证映射的顺序,特别是不保证顺序恒
Wesley13 Wesley13
3年前
Java中的Map集合
Map接口简介Map接口是一种双列集合,它的每个元素都包含一个键对象Key和值对象Value,键和值对象之间存在一种对应关系,称为映射。从Map集合中访问元素时,只要指定了Key,就能找到对应的Value,Map中的键必须是唯一的,不能重复,如果存储了相同的键,后存储的值会覆盖原有的值,简而言之就是键相同,值覆盖。Map常用
Stella981 Stella981
3年前
C#创建安全的字典(Dictionary)存储结构
  在上面介绍过栈(Stack)的存储结构,接下来介绍另一种存储结构字典(Dictionary)。 字典(Dictionary)里面的每一个元素都是一个键值对(由二个元素组成:键和值) 键必须是唯一的,而值不需要唯一的,键和值都可以是任何类型。字典(Dictionary)是常用于查找和排序的列表。 接下来看一下Dictionary的部分方法和类的底