WeakMap怎么在JavaScript中使用

  介绍

WeakMap怎么在JavaScript中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

WeakMap 对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。

语法

new  WeakMap ([iterable])

参数

iterable
iterable是一个数组(二元数组)或者其他可迭代的且其元素是键值对的对象。每个键值对会被加到新的,WeakMap里.null会被当做定义。

描述

WeakMap的关键只能是,Object 类型只原始数据类型是不能作为关键的(比如符号)。

为什么WeakMap ?

在JavaScript里,地图API可以通过使其四个API方法共用两个数组(一个存放键,一个存放值)来实现。给这种,地图设置值时会同时将键和值添加到这两个数组的末尾,从而使得键和值的索引在两个数组中相对应。当从该地图取值的时候,需要遍历所有的键,然后使用索引从存储值的数组中检索出相应的值。

但这样的实现会有两个很大的缺点,首先赋值和搜索操作都是O (n)的时间复杂度(n是键值对的个数),因为这两个操作都需要遍历全部整个数组来进行匹配。另外一个缺点是可能会导致内存泄漏,因为数组会一直引用着每个键和值。这种引用使得垃圾回收算法不能回收处理他们,即使没有其他任何引用存在的了。

相比之下,原生的WeakMap持有的是每个键对象的“弱引用”,这意味着在没有其他引用存在时垃圾回收能正确进行。原生WeakMap的结构是特殊且有效的,其用于映射的关键只有在其没有被回收时才是有效的。

正由于这样的弱引用,WeakMap的key 是不可枚举的(没有方法能给出所有的键)。如果关键是可枚举的话,其列表将会受垃圾回收机制的影响,从而得到不确定的结果,因此,如果你想要这种类型对象的,键值的列的表,你应该使用地图。

基本上,如果你要往对象上添加数据,又不想干扰垃圾回收机制,就可以使用WeakMap。

属性

<李>

WeakMap.length

length 属性的值为0。

<李>

WeakMap。李原型

WeakMap构造器的原型只允许添加属性到所有的WeakMap对象。

WeakMap 实例

所有,WeakMap 实例继承自,WeakMap.prototype。

属性

WeakMap.prototype。构造函数
返回创建WeakMap实例的原型函数。WeakMap函数是默认的。

方法

<李>

WeakMap.prototype.delete(关键)

移除关键的关联对象。执行后WeakMap.prototype.has(关键)返回错误的。

<李>

WeakMap.prototype.get(关键)

返回关键关联对象,或者未定义(没有关键关联对象时)。

<李>

WeakMap.prototype.has(关键)

根据是否有关键关联对象返回一个布尔值。

<李>

WeakMap.prototype。集(关键字,值)

在WeakMap中设置一组关键关联对象,返回这个WeakMap对象。

示例

使用WeakMap

const  wm1 =, new  WeakMap (),   ,,wm2 =, new  WeakMap (),   ,,wm3 =, new  WeakMap ();   const  o1 =, {},   ,,o2 =,函数(){},   ,,o3 =,窗口;      wm1.set (o1,, 37);   wm1.set (o2,,“azerty");   wm2.set (o1,, o2);,//,价值可以是任意值,包括一个对象或一个函数   wm2.set (o3,未定义);   wm2.set (wm1, wm2);,//,键和值可以是任意对象,甚至另外一个WeakMap对象      wm1.get (o2);,//,“azerty"   wm2.get (o2);,//,定义,wm2中没有o2这个键   wm2.get (o3);,//,未定义的值,就是未定义的      wm1.has (o2);//,真的   wm2.has (o2);//,假的   wm2.has (o3);,//, true (即使值是未定义)      wm3.set (o1,, 37);   wm3.get (o1);//, 37      wm1.has (o1);,,//,真的   wm1.delete (o1群);   wm1.has (o1);,,//,假

实现一个带有.clear()方法的类,WeakMap类

class  ClearableWeakMap  {   ,构造函数(init) {   时间=this._wm 才能;new  WeakMap (init)   ,}   ,明确(){   时间=this._wm 才能;new  WeakMap ()   ,}   ,删除(k) {   return 才能this._wm.delete (k)   ,}   ,得到(k) {   return 才能this._wm.get (k)   ,}   ,有(k) {   return 才能this._wm.has (k)   ,}   ,集(k, v), {   this._wm.set才能(k, v)   ,return 这   ,}   }

WeakMap怎么在JavaScript中使用