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中使用