前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JS WeakMap 什么时候用?

JS WeakMap 什么时候用?

作者头像
掘金安东尼
发布于 2022-09-22 01:39:56
发布于 2022-09-22 01:39:56
2.1K00
代码可运行
举报
文章被收录于专栏:掘金安东尼掘金安东尼
运行总次数:0
代码可运行

theme: channing-cyan

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情


减轻阅读负担,启发创作心智,轻松学习 JavaScript 技巧,日拱一卒,jym,冲~


map 大家都很熟悉了,WeakMap 听说过吗?听这个名字就很“弱”的,别误会,它不是“弱”,而是容易被清理

举个栗子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let john = { name: "John" };

let array = [ john ];

john = null; // 覆盖引用

console.log(array[0]) // {name: 'John'}

我们声明了一个 john 对象,然后在数组里面引用了它,然后再尝试清空它, john = null,然后再访问:array[0],结果发现,仍然能成功打印。

这说明 array 对 对象 john 的引用,导致内存无法正常清理。

WeakMap 就是来解决这个问题的:

对比 2 组代码,分别是 map 和 weakMap 在这个问题下的表现:

  • Map
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let john = { name: "John" };

let map = new Map();
map.set(john, "...");

john = null; // 覆盖引用

console.log(map.keys()) // 仍然能访问

// john 被存储在了 map 中,
// 我们仍可以使用 map.keys() 来获取它
  • WeakMap ``` let john = { name: "John" };

let weakMap = new WeakMap();

weakMap.set(john, "...");

john = null; // 覆盖引用

console.log(weakMap.has(john))

// john 被从内存中删除了!

```

WeakMap 中使用一个对象作为键,并且没有其他对这个对象的引用 —— 该对象将会被从内存(和map)中自动清除。

  • 此外特别说明:WeakMap 和 Map 的很重要的不同点就是,WeakMap 的键必须是对象,不能是原始值。

WeakMap 不支持迭代以及 keys(),values() 和 entries() 方法。所以没有办法获取 WeakMap 的所有键或值。

另外 WeakMap 只有以下的方法:weakMap.get(key)、weakMap.set(key, value)、weakMap.delete(key)、weakMap.has(key)

所以 WeakMap 的主要优点是它们对对象是弱引用,被它们引用的对象很容易地被垃圾收集器移除。但这是以不支持一些对象方法为代价换来的~

没有优劣之分,按需所取罢了~~

OK,以上便是本篇分享。点赞关注评论,为好文助力👍 我是掘金安东尼 🤠 100 万人气前端技术博主 💥 INFP 写作人格坚持 1000 日更文 ✍ 关注我,安东尼陪你一起度过漫长编程岁月 🌏

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • theme: channing-cyan
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档