资讯专栏INFORMATION COLUMN

ES6 - WeakMap

Youngdze / 1648人阅读

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的基本特殊和使用方法以及场景。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/106200.html

相关文章

  • es6基础0x014:WeakMap

    摘要:概述和使用上类似,在特性上和类似,和相比,有一下特点不可枚举的只能是对象是弱引用,内的如果没有引用,将会被垃圾回收机制回收初始化添加删除包含弱引用特性后输出一下内容,数据消失了 0x000 概述 WeakMap和Map使用上类似,在特性上和Set类似,和Map相比,有一下特点 不可枚举 WeakMap的key只能是对象 WeakMap是弱引用,WeakMap内的key如果没有引用...

    luzhuqun 评论0 收藏0
  • ES6 系列之 WeakMap

    摘要:一个对象若只被弱引用所引用,则被认为是不可访问或弱可访问的,并因此可能在任何时刻被回收。也就是说,一旦不再需要,里面的键名对象和所对应的键值对会自动消失,不用手动删除引用。如果有错误或者不严谨的地方,请务必给予指正,十分感谢。 前言 我们先从 WeakMap 的特性说起,然后聊聊 WeakMap 的一些应用场景。 特性 1. WeakMap 只接受对象作为键名 const map = ...

    CollinPeng 评论0 收藏0
  • 解读 webconponents.js 中对 ES6 WeakMap 的 shim (一)

    摘要:中对的要求主要是对非对象仅保留弱引用,且取值是复杂度,这导致了它的两个特性不能求大小,更不能枚举。按说这种关乎内存管理的对象是没法的。但是对有一个很奇妙的。在中的每一个中设置一个属性属性名是的唯一。值为该在中对应的。同时取值也是复杂度的。 ES6 中对 WeakMap 的要求主要是对 key(非 null 对象) 仅保留弱引用,且取值是 O(1) 复杂度,这导致了它的两个特性: 不...

    Imfan 评论0 收藏0
  • 经常会用到的es6的知识点

    摘要:经常会用到的的知识点提到我们就来说说,也是诞生,它的初始名叫。又名,在,和大受重用。年,负责制定规范草案的委员会决定将定义新标准的制度改为一年一次出现。它们在规范的先前版本中被称为模板字符串。它与数组非常相似,但是数据结构的成员都是唯一的。 经常会用到的es6的知识点 提到es6我们就来说说javascript,es6也是ES2015 1995:JavaScript诞生,它的初始名叫...

    asce1885 评论0 收藏0
  • es6 Map和WeakMap

    摘要:事实上,不仅仅是数组,任何具有接口且每个成员都是一个双元素的数组的数据结构都可以当做构造函数的参数。返回所有成员的遍历器需要特别注意的是,的遍历顺序就是插入顺序。转为转为,正常情况下,所有键名都是字符串。 Map JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。为了解决这个问题,ES6 提...

    sPeng 评论0 收藏0

发表评论

0条评论

Youngdze

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<