JavaScript WeakMap
创始人
2024-05-16 07:34:56
0

文章目录

  • 前言
  • 一、为何选用WeakMap
    • 1. Map
    • 2. WeakMap
  • 二、WeakMap原型方法
  • 总结


前言

我在处理一个复杂对象的深拷贝方法时接触到WeakMap, 其作为缓存结构以解决对象内部的循环引用问题. 为了改造这个方法, 决定研究WeakMap.


一、为何选用WeakMap

WeakMapMap都可以使用对象作为键, Map也可以使用基本数据类型作为键, 在特殊的情况下(都使用对象作为键), 两者看起来并无差别.

1. Map

Map会阻止JavaScript的内存回收机制对 以一个已经被回收的对象作为键的元素 进行回收.
Map内存储元素的方式有关:

A map API could be implemented in JavaScript with two arrays (one for keys, one for values) shared by the four API methods.
`map`在JavaScript内可通过使两个数组被4种方法共享来实现, 向`Map`内设置元素时分别将键和值`push`进这两个数组.
Setting elements on this map would involve pushing a key and value onto the end of each of those arrays simultaneously.
访问`Map`取值时需要遍历, 从两个数组内找到匹配的值.
var sayings = new Map();
sayings.set('dog', 'woof');
sayings.set('cat', 'meow');
sayings.set('elephant', 'toot');
sayings.size; // 3
sayings.get('fox'); // undefined
sayings.has('bird'); // false
sayings.delete('dog');
sayings.has('dog'); // falsefor (var [key, value] of sayings) {console.log(key + ' goes ' + value);
}
// "cat goes meow"
// "elephant goes toot"sayings.clear();
sayings.size; // 0

首先Map内部基于数组实现, 取值赋值需要遍历, 时间复杂度上来了:

The first one is an O(n) set and search (n being the number of keys in the map)
首先设置和查找的时间复杂度都是O(n), n是Map内键的数量.
since both operations must iterate through the list of keys to find a matching value.
因为两个操作都必须遍历每一个键以找到匹配的值.

其次数组会一直保留着对元素的引用, 这跟元素是否为引用类型无关, 只要数组不被销毁, 元素的引用也不会被销毁:

let ele1 = 'ele1';
let ele2 = { key: 'value' };let arr = [ ele1, ele2 ];ele1 = null; // 设置为null脱离当前执行环境, 以便回收机制回收
ele2.key = null;console.log(arr);
// [ 'ele1', { key: 'null' } ]

前面提到Map内部可以通过两个数组实现, 那么意味着在Map需要销毁前, Map内的键和值都无法被JavaScript垃圾回收机制回收, Map可能会变得臃肿庞大导致内存不足(内存泄漏).

持有原始对象引用的映射实际上意味着对象不能被垃圾回收, 这可能会导致意外的内存问题.
如果你希望存储在映射中的对象具有与原始对象相同的生命周期, 请考虑使用 WeakMap.

2. WeakMap

WeakMapMap是键值对的集合, 但它的键被弱保持, 即当键所指的对象未在其他地方被引用时, 将被垃圾回收机制回收.
其键必须是对象, 值可以是任意数据类型.

也由于这种弱引用实现的垃圾回收可执行, WeakMap内元素的存在变得不可预知(可能垃圾回收机制目前没有回收至此处, 但此处应当回收.), 为了防止执行时出现意外, WeakMap没有提供枚举方法.

正由于这样的弱引用, WeakMap的key是不可枚举的(没有方法能给出所有的 key).
如果key可枚举, 其列表将受垃圾回收机制的影响, 从而得到不确定的结果。

但是WeakMap提供的接口与Map相同, 可以通过接口稳定的访问元素.

let ele1 = { key: "value" };let weak = new WeakMap();
weak.set(ele1, "ele1");ele1 = null;console.log(weak); // WeakMap {  } 不赋值null此处结果相同
console.log(weak.get(ele1)); // undefined 销毁 不赋值null此处为'ele1'

总之, 相比Map, 它更干净利落, 更节约内存.
但是你如果有枚举需求, 或者就是需要一直保存着key不回收, 那就用Map.


二、WeakMap原型方法

指明需要何种操作, 并指明需要操作的键值对的key, 直接传变量即可.

方法描述
WeakMap.prototype.delete(key)删除WeakMap中与key相匹配的value.
WeakMap.prototype.get(key)返回WeakMap中与key相关联的值, 如果key不存在则返回undefined.
WeakMap.prototype.has(key)返回布尔值, 断言WeakMap对象中该key是否存在.
WeakMap.prototype.set(key, value)WeakMap中设置一组新的键值对, 返回设置完毕后的WeakMap对象.

总结

相关内容

热门资讯

安卓子系统windows11,... 你知道吗?最近科技圈可是炸开了锅,因为安卓子系统在Windows 11上的兼容性成了大家热议的话题。...
电脑里怎么下载安卓系统,电脑端... 你有没有想过,你的电脑里也能装上安卓系统呢?没错,就是那个让你手机不离手的安卓!今天,就让我来带你一...
索尼相机魔改安卓系统,魔改系统... 你知道吗?最近在摄影圈里掀起了一股热潮,那就是索尼相机魔改安卓系统。这可不是一般的改装,而是让这些专...
安卓系统哪家的最流畅,安卓系统... 你有没有想过,为什么你的手机有时候像蜗牛一样慢吞吞的,而别人的手机却能像风一样快?这背后,其实就是安...
安卓最新系统4.42,深度解析... 你有没有发现,你的安卓手机最近是不是有点儿不一样了?没错,就是那个一直在默默更新的安卓最新系统4.4...
android和安卓什么系统最... 你有没有想过,你的安卓手机到底是用的是什么系统呢?是不是有时候觉得手机卡顿,运行缓慢,其实跟这个系统...
平板装安卓xp系统好,探索复古... 你有没有想过,把安卓系统装到平板上,再配上XP系统,这会是怎样一番景象呢?想象一边享受着安卓的便捷,...
投影仪装安卓系统,开启智能投影... 你有没有想过,家里的老式投影仪也能焕发第二春呢?没错,就是那个曾经陪你熬夜看电影的“老伙计”,现在它...
安卓系统无线车载carplay... 你有没有想过,开车的时候也能享受到苹果设备的便利呢?没错,就是那个让你在日常生活中离不开的iOS系统...
谷歌安卓8系统包,系统包解析与... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,最近谷歌又发布了安卓8系统包,听说这个新...
微软平板下软件安卓系统,开启全... 你有没有想过,在微软平板上也能畅享安卓系统的乐趣呢?没错,这就是今天我要跟你分享的神奇故事。想象你手...
coloros是基于安卓系统吗... 你有没有想过,手机里的那个色彩斑斓的界面,背后其实有着一个有趣的故事呢?没错,我要说的就是Color...
安卓神盾系统应用市场,一站式智... 你有没有发现,手机里的安卓神盾系统应用市场最近可是火得一塌糊涂啊!这不,我就来给你好好扒一扒,看看这...
黑莓平板安卓系统升级,解锁无限... 亲爱的读者们,你是否还记得那个曾经风靡一时的黑莓手机?那个标志性的全键盘,那个独特的黑莓体验,如今它...
安卓文件系统采用华为,探索高效... 你知道吗?最近安卓系统在文件管理上可是有了大动作呢!华为这个科技巨头,竟然悄悄地给安卓文件系统来了个...
深度系统能用安卓app,探索智... 你知道吗?现在科技的发展真是让人惊叹不已!今天,我要给你揭秘一个超级酷炫的话题——深度系统能用安卓a...
安卓系统的分区类型,深度解析存... 你有没有发现,你的安卓手机里藏着不少秘密?没错,就是那些神秘的分区类型。今天,就让我带你一探究竟,揭...
安卓系统铠无法兑换,揭秘无法兑... 最近是不是有很多小伙伴在玩安卓系统的游戏,突然发现了一个让人头疼的问题——铠无法兑换!别急,今天就来...
汽车安卓系统崩溃怎么刷,一键刷... 亲爱的车主朋友们,你是否曾遇到过汽车安卓系统崩溃的尴尬时刻?手机系统崩溃还能重启,但汽车系统崩溃了,...
miui系统可以刷安卓p系统吗... 亲爱的手机控们,你是否对MIUI系统情有独钟,同时又对安卓P系统的新鲜功能垂涎欲滴?今天,就让我带你...